我已经写了一个简单的GL片段着色器,它在图像上执行RGB gamma调整:
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;
}纹理绘制了屏幕的大部分,我发现这是对屏幕上的每个输出像素应用调整,而不是对纹理上的每个输入像素应用调整。虽然这不会改变它的外观,但与屏幕相比,这种纹理很小。
为了提高效率,如何让着色器处理纹理像素而不是屏幕像素?如果有帮助,我会在每一帧上改变/重新加载这个纹理的数据,所以我不介意纹理被永久地改变。
发布于 2013-02-03 18:55:59
,我想到这是在屏幕上对每个输出像素应用调整
差不多了。片段着色器针对每个输出片段执行(因此而得名)。片段是写入像素之前光栅化的最小单位。由一块可见渲染几何体覆盖的每个像素都会转换为一个或多个碎片(是的,可能会有比覆盖的像素更多的碎片,例如绘制到抗锯齿帧缓冲区时)。
提高效率,
现代的GPU甚至不会“注意到”略微减少的负载。这是一种微优化,处于不可测量的边缘。我的建议是:不用担心。
如何让着色器处理纹理像素而不是屏幕像素?
可以对纹理进行预处理,方法是首先通过纹理大小而不是抗锯齿的帧缓冲区对象将其渲染为中间纹理。但是,如果您的更改是非线性的,而gamma调整正是如此,则不应执行此操作。您希望在线性颜色空间中处理图像,并尽可能晚地仅应用非线性变换。
https://stackoverflow.com/questions/14670362
复制相似问题