在纹理而不是屏幕上使用着色器

时间:2013-02-03 07:27:45

标签: opengl glsl shader

我写了一个简单的GL片段着色器,它对图像执行RGB伽玛调整:

uniform sampler2D tex;
uniform vec3 gamma;

void main()
{
    vec3 texel = texture2D(tex, gl_TexCoord[0].st).rgb;
    texel = pow(texel, gamma);
    gl_FragColor.rgb = texel;
}

纹理描绘了大部分屏幕,我发现这是在屏幕上应用每个输出像素的调整,而不是纹理上的每个输入像素。虽然这不会改变它的外观,但与屏幕相比,这种纹理很小。

为了提高效率,如何使着色器处理纹理像素而不是屏幕像素?如果它有帮助,我无论如何都要在每一帧上更改/重新加载这个纹理的数据,所以我不介意纹理是否会被永久改变。

1 个答案:

答案 0 :(得分:2)

  

我发现这是在屏幕上应用每个输出像素的调整

几乎。片段着色器按输出片段执行(因此名称)。在将片段写入像素之前,片段是光栅化的最小单位。被一块可见渲染几何体覆盖的每个像素都会变成一个或多个片段(是的,可能会有比覆盖像素更多的片段,例如绘制到抗锯齿帧缓冲区时)。

  

为提高效率,

现代GPU甚至不会“注意到”略微减少的负载。这是一种微观优化,即处于不可测量性的边缘。我的建议:不要担心。

  

如何使着色器处理纹理像素而不是屏幕像素?

您可以预处理纹理,首先通过纹理大小而不是抗锯齿的帧缓冲对象将其渲染到中间纹理。但是,如果您的更改是非线性,并且伽马调整正是如此,那么您不应该这样做。您希望在线性颜色空间中处理图像,并尽可能晚地应用非线性变换。

相关问题