我正在为不同的图像位深度和查找表着色。 所以我的工作很好但是对于查找我需要知道纹理的内部格式。实际上,这只是间接的事实,但它会完全为我服务。所以这就是我所拥有的:
#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_REDui
和GL_RED_INTEGER
作为纹理生成参数进行了不那么成功的尝试。我担心这比使用GL_RED8
/ GL_RED16
+ GL_LUMINANCE
你可以告诉我走那条路,但到目前为止,我会非常害怕失去的东西。最后,我会引入一件制服并将其作为我的因素。
答案 0 :(得分:1)
添加单个整体制服的任何特殊原因都是如此糟糕?
除了制服之外,唯一可以解决的问题(如果LutData的大小合适)可以在LutData上使用textureSize,但我认为这是一个丑陋的黑客。
最好的解决方案是您尝试使用的解决方案 - 如果您告诉我们为什么会出现问题,或许我们可以提供帮助?您是否将GL_RED用于GL_R32UI?