首页 > 解决方案 > OpenTK 纹理仅在未绑定时才有效

问题描述

我通常不使用低级别绑定,所以这可能是我忽略的一些愚蠢的事情,但我不知道。

当我从这样的文件创建纹理时

public Texture ( List<byte> pixels, int width, int height ) {
    handle = GL.GenTexture();
    GL.TexParameter( TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.Repeat );
    GL.TexParameter( TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.Repeat );
    GL.TexParameter( TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Nearest );
    GL.TexParameter( TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear );
    GL.TexImage2D( TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, width, height, 0, PixelFormat.Rgba, PixelType.UnsignedByte, pixels.ToArray() );
}

public void Use () {
    GL.Enable( EnableCap.Texture2D );
    GL.ActiveTexture( TextureUnit.Texture0 );
    GL.BindTexture( TextureTarget.Texture2D, handle );
}

然后像这样渲染它:

public void Draw () {
    GL.BindVertexArray( VAO );

    //texture.Use();
    shader.Use();

    GL.DrawElements( PrimitiveType.Triangles, indices.Length, DrawElementsType.UnsignedInt, 0 );
}

几乎一切正常,直到我加载另一个纹理。(这使得一切都成为第二个纹理)回到只有一个纹理,当我取消注释时,我texture.Use();的所有三角形都变黑了。到底是怎么回事?

我检查了GL.GenTexture();产量的值,它是 1 和 2,而唯一一次渲染纹理时,GL.BindTexture句柄是 0。将其设置为 1 或 2 会使三角形变黑。

标签: c#openglopentk

解决方案


GL.GenTexture()不生成纹理,它生成(保留)一个纹理(名称)id,可以用来生成纹理对象。纹理对象是在纹理 id 第一次绑定到目标时生成的,由GL.BindTexture. GL.TexImage2D指定现有纹理对象的二维纹理图像(它为图像保留内存并初始化图像)。GL.TexParameter将参数设置为现有纹理对象。这意味着您必须通过 , 创建纹理对象GL.BindTexture,然后才能设置任何纹理参数或指定任何纹理图像:

public Texture ( List<byte> pixels, int width, int height ) {
    handle = GL.GenTexture();

    GL.BindTexture( TextureTarget.Texture2D, handle ); # <--- THAT IS MISSING

    GL.TexParameter( TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.Repeat );
    GL.TexParameter( TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.Repeat );
    GL.TexParameter( TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Nearest );
    GL.TexParameter( TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear );
    GL.TexImage2D( TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, width, height, 0, PixelFormat.Rgba, PixelType.UnsignedByte, pixels.ToArray() );
}

请注意,当前绑定的纹理是一个全局状态,并且该状态会一直保留,直到再次更改。GL.TexImage2D指定当前绑定纹理的纹理图像。
由于您的原始函数Texture不绑定任何纹理对象,GL.TexImage2D因此指定该纹理的纹理图像,该纹理图像当时随机绑定到Texture2D当前纹理单元的目标。


推荐阅读