Golang+OpenGL中TEXTURE_2D_ARRAY无法渲染黑色立方体求助
解决TEXTURE_2D_ARRAY渲染黑色立方体的问题
我帮你排查了代码里的几个关键问题,这些应该就是导致纹理失效、渲染出黑色立方体的核心原因:
1. 纹理存储的内部格式错误(触发INVALID_ENUM)
你调用gl.TextureStorage3D时用了gl.RGBA作为内部格式参数,但在OpenGL 4.5核心模式下,gl.RGBA不是有效的内部格式枚举值——必须使用带明确位深的格式,比如gl.RGBA8(表示每个颜色通道占8位)。这个错误直接导致纹理存储初始化失败,后续的纹理子图像写入操作自然也会报错。
修改后的gl.TextureStorage3D调用:
gl.TextureStorage3D( gl.TEXTURE_2D_ARRAY, 1, gl.RGBA8, // 替换为带位深的有效内部格式 int32(rgba.Rect.Size().X), int32(rgba.Rect.Size().Y), 1, )
2. TexSubImage3D的连锁错误(触发INVALID_VALUE)
因为第一步的纹理存储初始化失败,TexSubImage3D必然会抛出INVALID_VALUE错误。修复完内部格式后,还要确认:
- 你的
rgba.Pix数据格式确实是RGBA(每个像素4字节),和gl.TexSubImage3D里指定的gl.RGBA格式完全匹配; - 如果加载的图片是RGB格式,要把格式参数改为
gl.RGB,同时内部格式对应gl.RGB8。
3. 顶点着色器的透视变换错误
你的顶点着色器里gl_Position的w分量写的是1.3,这会导致异常的透视变换,甚至可能让立方体被裁剪或渲染变形。应该改成标准的1.0:
gl_Position = projection * camera * model * vec4(vert, 1.0);
4. 纹理绑定的一致性问题
虽然你指定了纹理单元3,但TestTextureArray里没有保存GenBindTexture返回的纹理ID,后续渲染时无法确保纹理始终绑定在gl.TEXTURE3单元上。建议在渲染循环前(或每次渲染前)显式绑定:
// 先保存TestTextureArray里的纹理ID var textureID uint32 func TestTextureArray(){ textureID = GenBindTexture(gl.TEXTURE_2D_ARRAY) // ... 其他代码 } // 渲染循环内添加绑定逻辑 gl.ActiveTexture(gl.TEXTURE3) gl.BindTexture(gl.TEXTURE_2D_ARRAY, textureID)
5. 着色器Layer变量的未使用问题
你在渲染时设置了Layer uniform,但片元着色器里直接写死了vec3(uv,0),没有用到这个变量。如果你的目标是给立方体不同面用数组里的不同纹理层,应该改为:
outputColor=texture(tex1, vec3(uv, Layer));
注意你当前的纹理数组只有1层,所以Layer的值只能是0。
额外建议
- 坚持在每个关键OpenGL调用后检查错误,这能帮你快速定位问题根源;
- 用RenderDoc查看
TEXTURE_2D_ARRAY的实际纹理数据是否正确上传,而不只是检查sampler的绑定状态。
按照这些修改后,应该就能正常渲染出带纹理的立方体了。
内容的提问来源于stack exchange,提问作者Iteravse Acheson
相关产品推荐
相关产品推荐

