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
目标,那时候。
我通常不使用低级别绑定,所以这可能是我忽略的一些愚蠢的事情,但我不知道。
当我从这样的文件创建纹理时
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
目标,那时候。