Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 渲染器未在Open TK中使用纹理_C#_Opengl_Textures_Opentk_Texture2d - Fatal编程技术网

C# 渲染器未在Open TK中使用纹理

C# 渲染器未在Open TK中使用纹理,c#,opengl,textures,opentk,texture2d,C#,Opengl,Textures,Opentk,Texture2d,嗨,我正在尝试使用OpenGL中的纹理来使用OpenTK。我从中得到了一个基本的例子,但不起作用。我在stackoverflow上搜索了一些帮助,并更改了部分代码,但仍然不起作用。(发现并测试:) 到目前为止,我附带了这个片段,但它并没有显示纹理(而是显示白色): 更新(带有@The Fiddler建议) 在OpenTK.GLControl.Load事件处理程序中: GL.ClearColor(Color.MidnightBlue); GL.Enable(EnableCap.Texture2D)

嗨,我正在尝试使用OpenGL中的纹理来使用OpenTK。我从中得到了一个基本的例子,但不起作用。我在stackoverflow上搜索了一些帮助,并更改了部分代码,但仍然不起作用。(发现并测试:)

到目前为止,我附带了这个片段,但它并没有显示纹理(而是显示白色):

更新(带有@The Fiddler建议)

OpenTK.GLControl.Load
事件处理程序中:

GL.ClearColor(Color.MidnightBlue);
GL.Enable(EnableCap.Texture2D);

GL.Viewport(0, 0, control.Width, control.Height);

GL.MatrixMode(MatrixMode.Projection);
GL.LoadIdentity();
GL.Ortho(0, 4, 0, 3, -1, 1);

GL.Hint(HintTarget.PerspectiveCorrectionHint, HintMode.Nicest);

GL.GenTextures(1, out textureId);
GL.BindTexture(TextureTarget.Texture2D, textureId);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);

var bmp = new Bitmap(@"C:\myfolder\texture.png");
var data = bmp.LockBits(new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height),
    ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, data.Width, data.Height, 0,
    OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, data.Scan0);

System.Windows.Forms.MessageBox.Show("Erro: " + GL.GetError());

bmp.UnlockBits(data);
GL.Clear(ClearBufferMask.ColorBufferBit);

GL.MatrixMode(MatrixMode.Modelview);
GL.LoadIdentity();
GL.BindTexture(TextureTarget.Texture2D, textureId);

GL.Begin(BeginMode.Quads);

GL.TexCoord2(0, 0); GL.Vertex2(0, 0);
GL.TexCoord2(0, 1); GL.Vertex2(0, 1);
GL.TexCoord2(1, 1); GL.Vertex2(1, 1);
GL.TexCoord2(1, 0); GL.Vertex2(1, 0);

GL.End();

control.SwapBuffers();
OpenTK.GLControl.Paint
事件处理程序中:

GL.ClearColor(Color.MidnightBlue);
GL.Enable(EnableCap.Texture2D);

GL.Viewport(0, 0, control.Width, control.Height);

GL.MatrixMode(MatrixMode.Projection);
GL.LoadIdentity();
GL.Ortho(0, 4, 0, 3, -1, 1);

GL.Hint(HintTarget.PerspectiveCorrectionHint, HintMode.Nicest);

GL.GenTextures(1, out textureId);
GL.BindTexture(TextureTarget.Texture2D, textureId);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);

var bmp = new Bitmap(@"C:\myfolder\texture.png");
var data = bmp.LockBits(new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height),
    ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, data.Width, data.Height, 0,
    OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, data.Scan0);

System.Windows.Forms.MessageBox.Show("Erro: " + GL.GetError());

bmp.UnlockBits(data);
GL.Clear(ClearBufferMask.ColorBufferBit);

GL.MatrixMode(MatrixMode.Modelview);
GL.LoadIdentity();
GL.BindTexture(TextureTarget.Texture2D, textureId);

GL.Begin(BeginMode.Quads);

GL.TexCoord2(0, 0); GL.Vertex2(0, 0);
GL.TexCoord2(0, 1); GL.Vertex2(0, 1);
GL.TexCoord2(1, 1); GL.Vertex2(1, 1);
GL.TexCoord2(1, 0); GL.Vertex2(1, 0);

GL.End();

control.SwapBuffers();
进入第一部分的错误代码是:
1281
=
ErrorCode.InvalidValue

有人知道它为什么不渲染纹理吗?

白色纹理通常意味着(A)纹理定义不完整或(b)OpenGL错误状态扰乱了渲染。您的纹理定义看起来是正确的,因此请尝试调用
GL.GetError()
检查是否出现任何OpenGL错误

请注意,
PixelInternalFormat.Rgb8
需要OpenGL 3.x,因此在使用它之前需要检查OpenGL 3.x是否受支持。或者,尝试使用
PixelInternalFormat.Rgb
PixelInternalFormat.Rgba
,这些都是OpenGL 1.1支持的


编辑:您可以在中找到完整的工作示例。您可以通过OpenTK安装中的示例浏览器(OpenGL->1.x->Textures)运行此操作。

我将使用
GL.GetError()
添加更新。同时改变图像的参数。请检查它。您需要找到导致InvalidValue错误的行。要么添加更多对
GL.GetError()
的调用,要么编译OpenTK.dll的调试版本并使用它(每当OpenGL出错时,调试版本将抛出异常)