gpt4 book ai didi

c# - OpenTK 纹理仅在未绑定(bind)时才有效

转载 作者:行者123 更新时间:2023-12-02 02:13:29 24 4
gpt4 key购买 nike

我通常不使用低级绑定(bind),因此这可能是我忽略的愚蠢的事情,但我不知道。

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

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第一次绑定(bind)到目标时生成的,通过GL.BindTextureGL.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() );
}

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

关于c# - OpenTK 纹理仅在未绑定(bind)时才有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60963296/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com