TEXTURE_2D_ARRAY не рендеринг - PullRequest
0 голосов
/ 23 мая 2018

Я использую golang с OpenGL.
Я использую текстуру загрузки TEXTURE_2D_ARRAY для рендеринга куба, но в результате получается черный куб.Я уверен, что текстурный модуль указан правильно, потому что когда я использую ActiveTexture(gl.TEXTURE3) в TEXTURE_CUBE_MAP режиме загрузки, это предназначено для отображения, но теперь использование 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
любая помощь, и я был бы очень признателен!

1 Ответ

0 голосов
/ 25 мая 2018

наконец, я нахожу причину, используя gl.GetError() после gl.TextureStorage3D я получаю INVALID_ENUM, ссылаюсь на этот документ , что означает, что внутренний формат имеет проблему, поэтому я изменяю gl.RGBA на gl.RGBA8

все работает отлично ~ у него есть текстурное связывание одной единицы текстуры красивый куб ~

спасибо за каждый ответивший, я не одинок ^ v ^

...