c# - 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 会使三角形变黑。
解决方案
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
当前纹理单元的目标。
推荐阅读
- arrays - 如何在 Go 中清除和重用数组(不是切片)?
- mongodb - MongoDB - 我可以创建一个索引来隔离文档键中的值以加快搜索速度吗?
- python - 如何正确验证 REST API 查询参数?
- python - Python 语法:带有输入元组的 __getitem__ 和 __setitem__?
- java - 比较 3 个数组并将 Null 错误判断为某个值
- postsharp - PostSharp 不会在最新的 Visual Studio (16.8.1) 中构建
- java - 如何优化这个for循环?
- firebase - 将自定义域从一个项目更改为另一个项目
- java - 如何在 Json 中仅解包 id 参数
- python - 无法将消息发送回客户端