【发布时间】:2024-01-06 12:19:01
【问题描述】:
我编写了一个简单的 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;
}
纹理绘制了大部分屏幕,我想到这是在屏幕上应用每个输出像素的调整,而不是纹理上的每个输入像素。虽然这不会改变它的外观,但这个纹理与屏幕相比是很小的。
为了提高效率,如何让着色器处理纹理像素而不是屏幕像素?如果有帮助,无论如何我都会在每一帧上更改/重新加载此纹理的数据,所以我不介意纹理是否被永久更改。
【问题讨论】:
-
"无论如何我都会在每一帧上更改/重新加载此纹理的数据" 为什么在重新加载时不应用伽玛?
-
@NicolBolas 这是 Java。提取和重新合并整数的 RGB 分量所需的数组边界检查以及笨拙的移位和掩码使其变慢。 GPU 要好得多。