片段着色器是否处理来自顶点着色器的所有像素?

时间:2015-07-04 03:31:54

标签: c++ opengl

如果我的管道中只有顶点着色器和片段着色器,我想知道的是片段着色器是否从顶点着色器接收每个单独处理的顶点,或者等到所有传入的值都是在将顶点着色器提供给片段着色器之前处理它们然后单独处理每个像素或一次处理它们?

在顶点着色器获取下一个顶点或顶点输入进行处理之前,每个顶点着色器执行后片段着色器是否也会立即执行?

这意味着如果我的片段着色器执行此操作:

const GLchar * vertex_shader_source = {
    "#version 430 core\n"
    "layout(location = 0) in vert;\n"
    "void main(void)\n"
    "{\n"
    "gl_Position = vert;\n"
    "}\n"
};
const GLchar * fragment_shader_source = {
    "#version 430 core\n"
    "out vec4 color;\n"
    "void main(void)\n"
    "{\n"
    "color = vec4(gl_VertexID/100,gl_VertexID/100,gl_VertexID/100,1.0f);\n"
    "}\n"
};

片段着色器实际上是否与从缓冲区处理的每个顶点索引同步?

1 个答案:

答案 0 :(得分:1)

您的问题具有误导性。片段着色器不是接收顶点的情况。他们收到碎片。在顶点和片段着色器之间,有很多硬件需要多个顶点,从它们中形成三角形,对它们进行一堆处理(剔除,剪裁......)然后栅格化它们(将三角形转换为一堆有盖的正方形)生成将在片段着色器上执行的片段。

所有这一切都表明没有从顶点id到片段的自然映射(实际上你需要多个顶点来生成一个片段,在很多情况下,单个顶点也会产生多个三角形)。

因此,根本没有办法在片段着色器中有意义地使用gl_VertexID。

现在,关于“做顶点着色器在片段之前运行”还是这样的问题......生成的任何片段都必须已经计算了顶点位置(因为它需要计算片段覆盖率)。但它是你获得的唯一保证。

基于平铺的延迟渲染器,例如通常会先处理所有顶点(如果可以的话)(在整个帧上!),并且稍后一帧后它将处理所有片段。相比之下,“立即模式渲染器”将倾向于处理三角形,因为它们变得可用。没有很多方法可以真正观察这些事情,我不知道很多人确实对少数方法进行了观察。