OpenSceneGraph / OpenGL Image internalFormat

时间:2016-10-21 12:28:47

标签: c++ opengl glsl openscenegraph

我需要将2D纹理数组传递给片段着色器,以执行texelFetchuchar元素上的按位操作。

出于这个原因,我需要创建一个具有非常特定内部格式的纹理,以保证我的纹素是无符号字节整数,并且不会执行不转换为浮动的缩放操作。

我已经在通用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);
        }

0 个答案:

没有答案