opengl - TEXTURE_2D_ARRAY 未渲染

标签 opengl go textures shader

我将 golang 与 OpenGL 结合使用。
我使用 TEXTURE_2D_ARRAY 加载纹理渲染一个立方体,但结果是一个黑色立方体。 我确定纹理单元指定正确,因为当我在 TEXTURE_CUBE_MAP 加载模式下使用 ActiveTexture(gl.TEXTURE3) 时,它用于显示目的,但现在使用 TEXTURE_2D_ARRAY 看起来像纹理不起作用。

像这样的纹理加载代码

func GenBindTexture(TextureType uint32) uint32{

var texture uint32
gl.GenTextures(1, &texture)
gl.ActiveTexture(gl.TEXTURE3)
gl.BindTexture(TextureType, texture)
//gl.TexEnvi()

return  texture
}
func TestTextureArray(){
fmt.Println("texture number:",GenBindTexture(gl.TEXTURE_2D_ARRAY))
rgba,err:=DrawRGBA("Texture/T1.png")
if err!=nil{
    fmt.Println("Err:",err)
    return
}
gl.TextureStorage3D(
    gl.TEXTURE_2D_ARRAY,
    1,
    gl.RGBA,
    int32(rgba.Rect.Size().X),int32(rgba.Rect.Size().Y),
    1,
)
fmt.Printf("error is invlid option:%x\n",gl.GetError())//in here get INVALID_ENUM

gl.TexSubImage3D(
    gl.TEXTURE_2D_ARRAY,
    0,
    0,0,int32(0),
    int32(rgba.Rect.Size().X),int32(rgba.Rect.Size().Y),1,
    gl.RGBA,
    gl.UNSIGNED_BYTE,
    gl.Ptr(rgba.Pix),//they are color,i'm not set for random ,just test
)
fmt.Printf("error is invlid option:%x\n",gl.GetError())//in here get INVALID_Value
gl.TexParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MIN_FILTER, gl.LINEAR)
gl.TexParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_MAG_FILTER, gl.LINEAR)
gl.TexParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)
gl.TexParameteri(gl.TEXTURE_2D_ARRAY, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)//
}

渲染&统一设置

    TestTextureArray()
textureUniform := gl.GetUniformLocation(program, gl.Str("tex1\x00"))
gl.Uniform1i(textureUniform, 3) //传输tex1为对应的纹理单元id ,如果tex1已经被binding=纹理单元id则不用如此操作
//gl.Uniform1i(0,0)

fmt.Printf("error is:%x\n",gl.GetError())
gl.ClearColor(0.9, 0.9, 0.9, 0.6)

angle := 0.0
previousTime := glfw.GetTime()

for !window.ShouldClose() {
    gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT)
    // Update
    time := glfw.GetTime()
    elapsed := time - previousTime
    previousTime = time

    angle += elapsed
    model = mgl32.HomogRotate3D(float32(angle), mgl32.Vec3{0, 1, 0})

    // Render
    gl.UseProgram(program)
    gl.UniformMatrix4fv(modelUniform, 1, false,&model[0])
    gl.BindVertexArray(vao)
    //gl.DrawArrays(gl.TRIANGLE_STRIP, 0, 6*4)
    Render(program)
    window.SwapBuffers()
    glfw.PollEvents()
}
}
func Render(program uint32){
for CubeFace:=0;CubeFace!=6;CubeFace++  {
    SetUniformVar(program,"Layer",CubeFace)
    //gl.DrawArrays(gl.TRIANGLE_STRIP, 0, 6*4)
gl.DrawElementsBaseVertex(gl.TRIANGLE_STRIP,4,gl.UNSIGNED_INT,gl.PtrOffset(0),int32(CubeFace*4))
}

和这样的着色器代码

var VertexShaderMulti=`
# version 450
uniform mat4 projection;
uniform mat4 camera;
uniform mat4 model;

in vec3 vert;
in vec2 vertTexCoord;

out vec2 uv;

void main() {
    uv = vertTexCoord;
    gl_Position = projection * camera * model * vec4(vert, 1.3);
}
` + "\x00"


var FragmentShaderMulti=`
# version 450

uniform sampler2DArray tex1;
uniform int Layer=2;

in vec2 uv;

out vec4 outputColor;

void main(void){
    outputColor=texture(tex1, vec3(uv,0));
    }
`+ "\x00"

现在我实际上使用 RenderDoc 找到 sampler2DArray tex1 值 sampler2DArray tex1
任何帮助,我将不胜感激!

最佳答案

最后我找到了原因,在 gl.TextureStorage3D 之后使用 gl.GetError() 我得到了 INVALID_ENUM,引用这个 document这意味着内部格式有问题,所以我将 gl.RGBA 更改为 gl.RGBA8

一切都很完美~它有多个纹理绑定(bind)一个纹理单元 beautiful cube ~

谢谢大家的回答,我不是一个人^v^

关于opengl - TEXTURE_2D_ARRAY 未渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50485176/

相关文章:

c++ - OpenGL 中的天空盒

c++ - 64位和32位无符号整数双向映射的高效实现

c++ - 转换透明 png 会使 SDL/OpenGL 崩溃

带有 channel 的循环中的 goroutine

reflection - golang可以将参数数量未知的函数作为另一个函数的参数吗

go - [][]*数据类型在golang中是什么意思

c++ - OpenGL:当尺寸不能被 4 整除时,灰度纹理数据布局不匹配

javascript - 使用预乘 Alpha 读出 FBO

web-applications - 在服务器上以批处理方式将纹理映射到 3D 对象

cross-browser - Three.js:平铺纹理、缓冲和浏览器兼容性