[OpenGL]Rendering Pipeline(渲染管线)流程概述
Pipeline
The OpenGL rendering pipeline works in the following order:
- Prepare vertex array data, and then render it
- Vertex Processing:
- Each vertex is acted upon by a Vertex Shader. Each vertex in the stream is processed in turn into an output vertex.
- Optional primitive tessellation stages.
- Optional Geometry Shader primitive processing. The output is a sequence of primitives.
- Vertex Post-Processing, the outputs of the last stage are adjusted or shipped to different locations.
- Transform Feedback happens here.
- Primitive Clipping, the perspective divide, and the viewport transform to window space.
- Primitive Assembly
- Scan conversion and primitive parameter interpolation, which generates a number of Fragments.
- A Fragment Shader processes each fragment. Each fragment generates a number of outputs.
- Per-Sample_Processing:
- Scissor Test
- Stencil Test
- Depth Test
- Blending
- Logical Operation
- Write Mask
参考自:Rendering Pipeline Overview
https://www.khronos.org/opengl/wiki/Rendering_Pipeline_Overview
流程实例
有了上述概念后,再来以一个简单实例演示管线流程:从一个 vertex shader 到一个 fragment shader 最简单流程。
basic.vert
#version 410
layout (location=0) in vec3 VertexPosition;
layout (location=1) in vec3 VertexColor;
out vec3 Color;
void main()
{
Color = VertexColor;
gl_Position = vec4(VertexPosition,1.0);
}
basic.frag
#version 410
in vec3 Color;
layout (location=0) out vec4 FragColor;
void main() {
FragColor = vec4(Color, 1.0);
}
basic.vert中的VertexColor是绑定的顶点属性(即:vertex attribute,输入参数),由OpenGL的库函数(一般都是编译型语言实现,例如C)glBindBuffer
、glBufferData
等接口绑定,然后直接赋值给输出参数Color,这个Color会被渲染管线自动传递给fragment shader,fragement shader计算完毕后,然后再输出给FragColor
。如果 fragment shader 只有一个输出参数,那么在你的OpenGL程序中可以不用glBindFragDataLocation
、glGetFragDataLocation
等库函数来指定输出参数。
gl_Position
是OpenGL提供的属性,用来存储当前vertex的position,以供管线流程中的 tessellation shader 和 geometry shader 运行时使用。
谁都可能出个错儿,你在一件事情上越琢磨得多就越容易出错。---《好兵帅克历险记》