【发布时间】:2015-07-04 03:31:53
【问题描述】:
如果我的管道中只有顶点着色器和片段着色器,我想知道的是片段着色器是从顶点着色器接收每个单独处理的顶点还是等到所有传入的值顶点着色器在将它们提供给片段着色器之前进行处理,然后单独处理每个像素或一次处理它们?
在顶点着色器获取下一个顶点或顶点输入进行处理之前,片段着色器是否会在每个顶点着色器执行后立即执行?
如果我有我的片段着色器这样做的意思:
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"
};
片段着色器实际上会与从缓冲区处理的每个顶点索引同步吗?
【问题讨论】:
-
为什么重要(不是混蛋,只是一个直截了当的问题)? GPU 往往会并行执行很多操作,我认为您无法可靠地预测您想知道的内容,因为它可能会根据特定的 gpu 和驱动程序等而有所不同。例如,进行平铺渲染的 GPU 将场景渲染为平铺,因此在使用片段着色器进行光栅化之前,它们可能不会立即使用顶点着色器处理几何体中的所有顶点。
-
是,也许,或者不,取决于哪个 GPU。大多数 GPU 都会有一些东西来避免处理对最终图像没有贡献的顶点,并且着色器显然不会看到这种“剔除”的顶点。并且它是在很长一段时间之后是立即之后又取决于GPU设计。可能是它处理所有顶点,并在完成后运行片段着色器,或者它可能一次处理几个顶点,或者真正流水线化。最有可能的是,在任何实际系统中,它们都不是“同步”的——GPU 在异步时会表现得更好。
-
...
gl_VertexID仅在顶点着色器中可用,在片段着色器中不可用!