我需要将2D纹理数组传递给片段着色器,以执行texelFetch
和uchar
元素上的按位操作。
出于这个原因,我需要创建一个具有非常特定内部格式的纹理,以保证我的纹素是无符号字节整数,并且不会执行不转换为浮动的缩放操作。
我已经在通用uint8_t*
数组中使用了我的图像缓冲区。
所以我这样做:
osg::Texture2DArray texture = new osg::Texture2DArray;
for (int i = 0; i < ntextures; i++) {
osg::Image* image = new osg::Image(
textureWidth,
256,
1,
GL_R8UI, // Texture Internal Format
GL_RED_INTEGER, // Pixel Format
GL_UNSIGNED_BYTE, // Pixel Type
imageBufferPtr[i]);
texture->setImage(i, image);
}
以前的代码在OpenGL管道中出现Invalid operation
错误。
另一方面,如果我这样做
osg::Image* image = new osg::Image(
textureWidth,
256,
1,
GL_LUMINANCE, // Texture Internal Format
GL_LUMINANCE, // Pixel Format
GL_UNSIGNED_BYTE, // Pixel Type
imageBufferPtr[i]);
不会产生任何错误,但我的纹理会以某种方式被破坏(可能会执行某些强制转换操作)。
我该如何解决这个问题?
我确保没有执行调整为2的幂的纹理。
额外
这是我的片段着色器
#version 130
#extension GL_EXT_texture_array : enable
in vec4 texcoord;
uniform uint width;
uniform uint height;
uniform usampler2DArray textureA;
void main() {
uint x = uint(texcoord.x * float(width));
uint y = uint(texcoord.y * float(height));
uint shift = x % 8u;
uint mask = 1u << shift;
uint octet = texelFetch(textureA, ivec3(x / 8u, y % 256u,y / 256u), 0).r;
uint value = (octet & mask) >> shift;
if (value > 0u)
gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
else
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}