我正在尝试在 iPad2 上编写一个简单的 GLSL 片段着色器,我遇到了一个奇怪的问题,即一旦像素值作为纹理的一部分转换为浮点数,OpenGL 似乎表示 8 位“红色”值的方式上传。我想要做的是传入包含大量 8 位表索引和实际像素值的 32bpp 表的纹理。
我的纹理数据看起来像这样:
// Lookup table stored in a texture
const uint32_t pixel_lut_num = 7;
uint32_t pixel_lut[pixel_lut_num] = {
// 0 -> 3 = w1 -> w4 (w4 is pure white)
0xFFA0A0A0,
0xFFF0F0F0,
0xFFFAFAFA,
0xFFFFFFFF,
// 4 = red
0xFFFF0000,
// 5 = green
0xFF00FF00,
// 6 = blue
0xFF0000FF
};
uint8_t indexes[4*4] = {
0, 1, 2, 3,
4, 4, 4, 4,
5, 5, 5, 5,
6, 6, 6, 6
};
然后绑定每个纹理并像这样上传纹理数据:
GLuint texIndexesName;
glGenTextures(1, &texIndexesName);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texIndexesName);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RED_EXT, width, height, 0, GL_RED_EXT, GL_UNSIGNED_BYTE, indexes);
GLuint texLutName;
glGenTextures(1, &texLutName);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, texLutName);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, pixel_lut_num, 1, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, pixel_lut);
我确信纹理设置和统一值按预期工作,因为片段着色器主要使用以下代码:
varying highp vec2 coordinate;
uniform sampler2D indexes;
uniform sampler2D lut;
void main()
{
// normalize to (RED * 42.5) then lookup in lut
highp float val = texture2D(indexes, coordinate.xy).r;
highp float normalized = val * 42.5;
highp vec2 lookupCoord = vec2(normalized, 0.0);
gl_FragColor = texture2D(lut, lookupCoord);
}
上面的代码采用 8 位索引并在 lut 中查找 32bpp BGRA 像素值。我不明白的部分是这个 42.5 值在 OpenGL 中定义的位置。我通过反复试验找到了这个比例值,并且我已经确认每个像素的输出颜色都是正确的(意味着每个 lut 表查找的索引是正确的),值为 42.5。但是,OpenGL 究竟是如何得出这个值的呢?
在查看此OpenGL 手册页时,我发现在将 8 位“索引”值转换为 OpenGL 内部使用的浮点值时似乎使用了两个颜色常量 GL_c_SCALE 和 GL_c_BIAS。这些常量在哪里定义,我如何在运行时或编译时查询值?“索引”表的实际浮点值是这里的真正问题吗?我不明白为什么 texture2D(indexes,...) 调用会返回这个时髦的值,是否有其他方法可以获取适用于 iOS 的索引的 int 或 float 值?我尝试查看 1D 纹理,但它们似乎不受支持。