glsl 片段着色器一次绘制执行多少次?
How many times does the glsl fragment shader execute for one draw?
这些是常见的 glsl 片段着色器:
#version 450
#extension GL_ARB_separate_shader_objects : enable
layout(location = 0) in vec3 inColor;
layout(location = 0) out vec4 outColor;
void main(){
outColor = vec4(inColor, 1.0);
}
我知道顶点着色器每个顶点执行一次,片段着色器每个片段执行一次。
但是为什么outColor是vec4,只有一个像素大小(vec4 == rgba)。
如果是输出fragment,outColor不是应该大点吗?
我认为您误解了片段的实际含义。
一个片段是一个像素...有点。在最基本的意义上,您可以将片段视为“潜在像素”。 Is 有一个 rgba 值,这是将被绘制到屏幕上的值 if 它被渲染。
想象一下最简单的场景:您正在全屏上渲染一个四边形,并且您的屏幕尺寸为 100x100。在这种情况下,您的片段着色器 运行 为该四边形中的每个片段执行一次。对于这个程序,这意味着 100 * 100 = 10000 次,对屏幕上的每个像素一次。
然而,并非在着色器中渲染的每个片段都必须显示在屏幕上。让我们把场景稍微复杂一点:你有两个四边形,一个在另一个后面。您只是在启用深度测试的情况下渲染这两个四边形。即使一个四边形完全位于另一个四边形之后,并且由于被第一个四边形遮挡而不会被看到,您仍然需要 运行 第二个四边形中每个“潜在像素”的片段着色器。仅仅因为看不到片段,并不意味着您没有 运行 它的片段着色器。除非您启用了早期深度测试,否则片段只会在您 运行 片段着色器之后被丢弃。在这种情况下,片段着色器将为两个四边形中的每个片段 运行 一次,所以 20000 次。
因此,从本质上讲,您可以将片段视为最终可能显示或不显示的像素。 (这是一个相当简单的过程,但有助于理解基础知识)
这些是常见的 glsl 片段着色器:
#version 450
#extension GL_ARB_separate_shader_objects : enable
layout(location = 0) in vec3 inColor;
layout(location = 0) out vec4 outColor;
void main(){
outColor = vec4(inColor, 1.0);
}
我知道顶点着色器每个顶点执行一次,片段着色器每个片段执行一次。
但是为什么outColor是vec4,只有一个像素大小(vec4 == rgba)。 如果是输出fragment,outColor不是应该大点吗?
我认为您误解了片段的实际含义。
一个片段是一个像素...有点。在最基本的意义上,您可以将片段视为“潜在像素”。 Is 有一个 rgba 值,这是将被绘制到屏幕上的值 if 它被渲染。
想象一下最简单的场景:您正在全屏上渲染一个四边形,并且您的屏幕尺寸为 100x100。在这种情况下,您的片段着色器 运行 为该四边形中的每个片段执行一次。对于这个程序,这意味着 100 * 100 = 10000 次,对屏幕上的每个像素一次。
然而,并非在着色器中渲染的每个片段都必须显示在屏幕上。让我们把场景稍微复杂一点:你有两个四边形,一个在另一个后面。您只是在启用深度测试的情况下渲染这两个四边形。即使一个四边形完全位于另一个四边形之后,并且由于被第一个四边形遮挡而不会被看到,您仍然需要 运行 第二个四边形中每个“潜在像素”的片段着色器。仅仅因为看不到片段,并不意味着您没有 运行 它的片段着色器。除非您启用了早期深度测试,否则片段只会在您 运行 片段着色器之后被丢弃。在这种情况下,片段着色器将为两个四边形中的每个片段 运行 一次,所以 20000 次。
因此,从本质上讲,您可以将片段视为最终可能显示或不显示的像素。 (这是一个相当简单的过程,但有助于理解基础知识)