如何在GLSL中找出纹理格式

时间:2015-10-21 12:52:21

标签: opengl glsl textures shader

我正在为不同的图像位深度和查找表着色。 所以我的工作很好但是对于查找我需要知道纹理的内部格式。实际上,这只是间接的事实,但它会完全为我服务。所以这就是我所拥有的:

        #version 150
        precision highp float;

        uniform samplerBuffer LutData; 
        uniform sampler2D Texture;     
        void main() 
        { 
            color = texture(Texture, fragTexCoord);
            // R16 grayscale texture - handle 16bit wise mono
            float primaryLvl = color.r;
            int index = int(primaryLvl * 65535);
            float gray = texelFetch(LutData, index).r;
            finalColor = vec4(gray, gray, gray, 1);
        }

缩短版本(可能不起作用)

我需要的是这个(伪代码+仅主要代码):

        void main() 
        { 
            // need follows here:
            int lutspread = gettextureparam(Texture, MaxRange);

            color = texture(Texture, fragTexCoord);
            // R16 grayscale texture - handle 16bit wise mono
            float primaryLvl = color.r;
            int index = int(primaryLvl * lutspread);
            float gray = texelFetch(LutData, index).r;
            finalColor = vec4(gray, gray, gray, 1);
        }

这样的事情存在吗?

因此lutspread为255或65535.因为"正常"采样器的作用是:它们将纹理整数作为标准化整数,使得32位浮点值介于0.0-1.0之间。并且纹理格式是RED8还是RED16没有区别,它只是或多或少粒状!但是,如果LUT是游戏的一部分,那么这个功能是有效的,因为LUT需要原始数据。

BTW:我已经使用GL_REDuiGL_RED_INTEGER作为纹理生成参数进行了不那么成功的尝试。我担心这比使用GL_RED8 / GL_RED16 + GL_LUMINANCE

的当前方法给我带来更多问题

你可以告诉我走那条路,但到目前为止,我会非常害怕失去的东西。最后,我会引入一件制服并将其作为我的因素。

1 个答案:

答案 0 :(得分:1)

添加单个整体制服的任何特殊原因都是如此糟糕?

除了制服之外,唯一可以解决的问题(如果LutData的大小合适)可以在LutData上使用textureSize,但我认为这是一个丑陋的黑客。

最好的解决方案是您尝试使用的解决方案 - 如果您告诉我们为什么会出现问题,或许我们可以提供帮助?您是否将GL_RED用于GL_R32UI?