C# OpenTK - 纹理四边形
C# OpenTK - Textured Quad
我最近下载了 OpenTK。我创建了一个基本游戏 class 和一个四边形游戏。我试过在我的四边形中渲染纹理,但它不起作用。这是我的代码。这是纹理的加载。 (纹理 class 仅包含一个 ID 和一个位图。GetWidth() 和 GetHeight() 仅 returns Bitmap.Width 和 Bitmap.Height)。
Texture Texture = new Texture ();
Texture.Bitmap = new Bitmap (Path);
Texture.ID = GL.GenTexture ();
GL.BindTexture (TextureTarget.Texture2D, Texture.ID);
BitmapData data = Texture.Bitmap.LockBits (new Rectangle (0, 0, Texture.GetWidth (), Texture.GetHeight ()), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
GL.TexImage2D (TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, Texture.GetWidth(), Texture.GetHeight(), 0, OpenTK.Graphics.OpenGL.PixelFormat.Rgba, PixelType.Bitmap, data.Scan0);
Texture.Bitmap.UnlockBits (data);
GL.TexParameter (TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)All.Linear);
GL.TexParameter (TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)All.Linear);
return Texture;
这是渲染方式
GL.Enable (EnableCap.Texture2D);
GL.BindTexture (TextureTarget.Texture2D, ID);
GL.Begin (PrimitiveType.Quads);
GL.TexCoord2 (0, 1); GL.Vertex2 (0, 32);
GL.TexCoord2 (1, 1); GL.Vertex2 (32, 32);
GL.TexCoord2 (1, 0); GL.Vertex2 (32, 0);
GL.TexCoord2 (0, 0); GL.Vertex2 (0, 0);
GL.End ();
GL.Disable (EnableCap.Texture2D);
它只渲染四边形,没有别的。有人可以帮我吗?
尝试替换:
GL.TexImage2D (TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, Texture.GetWidth(), Texture.GetHeight(), 0, OpenTK.Graphics.OpenGL.PixelFormat.Rgba, PixelType.Bitmap, data.Scan0);
与:
GL.TexImage2D (TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, Texture.GetWidth(), Texture.GetHeight(), 0, OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, data.Scan0);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, TextureWrapMode.ClampToEdge);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, TextureWrapMode.ClampToEdge);
这应该可以解决。在你那里存在格式问题,你使用的内容不能准确地表示 System.Drawing.Bitmap 如何表示 32bpp Argb 位图。
我最近下载了 OpenTK。我创建了一个基本游戏 class 和一个四边形游戏。我试过在我的四边形中渲染纹理,但它不起作用。这是我的代码。这是纹理的加载。 (纹理 class 仅包含一个 ID 和一个位图。GetWidth() 和 GetHeight() 仅 returns Bitmap.Width 和 Bitmap.Height)。
Texture Texture = new Texture ();
Texture.Bitmap = new Bitmap (Path);
Texture.ID = GL.GenTexture ();
GL.BindTexture (TextureTarget.Texture2D, Texture.ID);
BitmapData data = Texture.Bitmap.LockBits (new Rectangle (0, 0, Texture.GetWidth (), Texture.GetHeight ()), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
GL.TexImage2D (TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, Texture.GetWidth(), Texture.GetHeight(), 0, OpenTK.Graphics.OpenGL.PixelFormat.Rgba, PixelType.Bitmap, data.Scan0);
Texture.Bitmap.UnlockBits (data);
GL.TexParameter (TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)All.Linear);
GL.TexParameter (TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)All.Linear);
return Texture;
这是渲染方式
GL.Enable (EnableCap.Texture2D);
GL.BindTexture (TextureTarget.Texture2D, ID);
GL.Begin (PrimitiveType.Quads);
GL.TexCoord2 (0, 1); GL.Vertex2 (0, 32);
GL.TexCoord2 (1, 1); GL.Vertex2 (32, 32);
GL.TexCoord2 (1, 0); GL.Vertex2 (32, 0);
GL.TexCoord2 (0, 0); GL.Vertex2 (0, 0);
GL.End ();
GL.Disable (EnableCap.Texture2D);
它只渲染四边形,没有别的。有人可以帮我吗?
尝试替换:
GL.TexImage2D (TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, Texture.GetWidth(), Texture.GetHeight(), 0, OpenTK.Graphics.OpenGL.PixelFormat.Rgba, PixelType.Bitmap, data.Scan0);
与:
GL.TexImage2D (TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, Texture.GetWidth(), Texture.GetHeight(), 0, OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, data.Scan0);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, TextureWrapMode.ClampToEdge);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, TextureWrapMode.ClampToEdge);
这应该可以解决。在你那里存在格式问题,你使用的内容不能准确地表示 System.Drawing.Bitmap 如何表示 32bpp Argb 位图。