Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 纹理_2D_数组未渲染_Opengl_Go_Textures_Shader - Fatal编程技术网

Opengl 纹理_2D_数组未渲染

Opengl 纹理_2D_数组未渲染,opengl,go,textures,shader,Opengl,Go,Textures,Shader,我正在将golang与OpenGL一起使用。 我使用纹理_2D_数组加载纹理渲染立方体,但结果是黑色立方体。 我确信纹理单位的指定是正确的,因为当我在texture\u CUBE\u MAP加载模式下使用ActiveTexture(gl.TEXTURE3)时,它是用于显示的,但现在使用texture\u 2D\u数组看起来纹理不起作用 纹理加载代码如下 func GenBindTexture(TextureType uint32) uint32{ var texture uint32 gl.G

我正在将golang与OpenGL一起使用。
我使用纹理_2D_数组加载纹理渲染立方体,但结果是黑色立方体。 我确信纹理单位的指定是正确的,因为当我在
texture\u CUBE\u MAP
加载模式下使用
ActiveTexture(gl.TEXTURE3)
时,它是用于显示的,但现在使用texture\u 2D\u数组看起来纹理不起作用

纹理加载代码如下

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)//
}
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"
渲染和均匀设置

    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))
}
}

像这样的着色器代码

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)//
}
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值

如果有任何帮助,我将不胜感激

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

一切都很完美~它有一个多纹理绑定一个纹理单元a~


感谢每一位回答者,我不是唯一一个^v^

粗体字体不会让你的问题变得更重要的人。你知道吗?我整天都在为这个问题苦恼,QWQD不包括(或链接到)文本的照片。只需复制并粘贴文本即可。好的,但为什么?我想要这个问题的生动比喻渲染代码在哪里?在哪里设置纹理一致性?您是否使用GPU调试器检查纹理是否包含有效数据?