在GLSL片段着色器中,如何在特定的mipmap级别访问texel?

问题描述:

我使用OpenGL通过一个顶点着色器和一个片段着色器的组合来完成一些GPGPU计算。我需要对不同规模的图像进行计算。我想使用mipmap,因为他们的代可以自动和硬件加速。但是我无法设法访问片段着色器中的mipmap纹理。在GLSL片段着色器中,如何在特定的mipmap级别访问texel?

我启用了自动生成mipmap: glTexParameteri(GL_TEXTURE_2D,GL_GENERATE_MIPMAP,GL_TRUE);

我试着在着色器中使用texture2DLod而没有运气,它只是保持正常的纹理。我也尝试在主程序中使用glTextureParameteri(GL_BASE_LEVEL,X),它没有改变任何东西。

你会怎么做?

我正在使用Linux。我的显卡是Nvidia Quadro,相当老旧。 Here是我的glxinfo输出与所有受支持的扩展。

+0

我上传了你的问题,因为它“有用而且清晰”,但你似乎一切正常。 glTextureSize(sampler,lod)说什么?(在你的片段着色器中) – Calvin1602 2010-09-03 13:21:03

+0

我没有这样的功能。我认为我的卡太旧了(我刚刚检查过,GLSL的版本是GL_ARB_shading_language_100)。这将解释很多,但我不明白为什么着色器会接受* Lod变体而不抱怨它不被支持... – Jim 2010-09-06 11:20:54

+0

我不明白为什么glTextureParameteri(GL_BASE_LEVEL,X)和glTextureParameteri(GL_MAX_LEVEL,X )调用也没有效果。这不是GLSL相关的...我现在很困惑。 – Jim 2010-09-06 11:24:36

gvec4 textureLod (gsampler1D sampler, float P, float lod) 
gvec4 textureLod (gsampler2D sampler, vec2 P, float lod) 
gvec4 textureLod (gsampler3D sampler, vec3 P, float lod) 
gvec4 textureLod (gsamplerCube sampler, vec3 P, float lod) 
float textureLod (sampler1DShadow sampler, vec3 P, float lod) 
float textureLod (sampler2DShadow sampler, vec3 P, float lod) 
gvec4 textureLod (gsampler1DArray sampler, vec2 P, float lod) 
gvec4 textureLod (gsampler2DArray sampler, vec3 P, float lod) 
float textureLod (sampler1DArrayShadow sampler, vec3 P, float lod) 

您是否尝试过其中一种内置?另外lod必须是浮动类型。报告GLSL编译器有哪些错误/警告?

+0

嗨,很抱歉,很长的延迟。我尝试了texture2DLod函数。奇怪的是,无论我给“lod”赋予什么样的价值,返回的值都与标准的texture2D查找完全相同。在着色器编译中不会产生错误甚至警告。 – Jim 2010-09-06 11:18:43

尝试:

glGenerateMipmapEXT(GL_TEXTURE_2D); 

绑定纹理后。 (而这样做当然渲染之前)

glTexParameteri-GL_GENERATE_MIPMAP已被弃用我想...... MFG的Digi

的GLSL 1.20规范(部分8.7)指出,片段着色不能选择自己的纹理贴图的水平(这纹理* Lod函数仅在顶点着色器中可用)。如果有的话,你可能会使用非Lod变体的bias参数来改变mipmap级别,但它只能改变它相对于卡已经为你计算的值。

我不知道GLSL的后期版本是否可能改变了这一点。

+0

事实上,他们已经改变了这一点,正如这个问题的第一个答案所表明的那样。 – 2012-08-18 11:05:16