我将 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/