You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:44:23