OpenGL中GL_RGB32UI整数纹理采样时texture函数始终返回0如何解决
问题根因
你创建的是无符号整数纹理(GL_RGB32UI),但着色器中使用了适配浮点/归一化纹理的普通sampler2D采样器,类型不匹配导致采样结果异常。你之前通过glReadPixels能读到正确数据,说明纹理本身的存储和写入逻辑没有问题,问题仅出在着色器采样环节的类型不匹配。
修复步骤
- 替换采样器类型
把着色器里的采样器声明修改为无符号整数纹理专用的usampler2D:// 错误写法:普通sampler2D仅支持浮点/归一化纹理 // uniform sampler2D gPixelIDsTex; // 正确写法:usampler2D对应无符号整数纹理,isampler2D对应有符号整数纹理 uniform usampler2D gPixelIDsTex; - 调整采样逻辑
使用usampler2D采样后返回的结果本身就是uvec3类型,无需额外强制类型转换:uint objID = texture(gPixelIDsTex, fragData.TexCoords).r; - 修复调试显示逻辑
直接将大于等于1的整数ID输出到FragColor会被OpenGL默认的颜色归一化逻辑截断为1,显示为纯白色,很容易被误判为数值为0。调试时需要先做数值映射:// 除数可根据你实际的objectID最大值调整 float normalizedID = float(objID) / 255.0; FragColor = vec4(normalizedID, normalizedID, normalizedID, 1.0);
内容的提问来源于stack exchange,提问作者stackoverflow_usr
相关产品推荐
相关产品推荐

