OpenTK 纹理只有在未绑定时才有效

OpenTK texture works only if its not bound

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

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

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 使三角形黑色.

GL.GenTexture() does not generate a texture, it generates (reserves) a texture (name) id, which can be used to generate a texture object. The texture object is generated when the texture id is bound to a target the first time, by GL.BindTexture. GL.TexImage2D specify a two-dimensional texture image (it reserves the memory for the image and initializes the image) of an existing texture object. 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目标,那时候。