2012-07-25 148 views
5

画面にテクスチャを読み込んで表示しようとしていますが、表示されるべき場所に黒いボックスが表示されています。OpenGL C#(OpenTK)画像読み込みと描画機能が動作しない

"LoadTexture"と "Draw Image"の2つの主な方法は、間違いがあると想定しています。

using System; 
using System.Diagnostics; 
using OpenTK; 
using OpenTK.Graphics; 
using OpenTK.Graphics.OpenGL; 
using System.Drawing; 
using System.Drawing.Imaging; 

namespace FailRender 
{ 
    public class FailRender: GameWindow 
    { 
     public FailRender() : base(800, 600, GraphicsMode.Default, "Hoard of Upgrades") 
     { 
      GL.ClearColor(0, 0.1f, 0.4f, 1); 

      texture = LoadTexture("sand.jpg"); 
     } 

     private int texture; 

     public int LoadTexture(string file) 
     { 
      Bitmap bitmap = new Bitmap(file); 

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

      GL.GenTextures(1, out tex); 
      GL.BindTexture(TextureTarget.Texture2D, tex); 

      BitmapData data = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height), 
       ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppRgb); 

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

      GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear); 
      GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear); 

      return tex; 
     } 

     public static void DrawImage(int image) 
     { 
      GL.MatrixMode(MatrixMode.Projection); 
      GL.PushMatrix(); 
      GL.LoadIdentity(); 

      GL.Ortho(0, 800, 0, 600, -1, 1); 

      GL.MatrixMode(MatrixMode.Modelview); 
      GL.PushMatrix(); 
      GL.LoadIdentity(); 

      GL.Disable(EnableCap.Lighting); 

      GL.Enable(EnableCap.Texture2D); 

      GL.Color4(1, 0, 0, 1); 

      GL.BindTexture(TextureTarget.Texture2D, image); 

      GL.Begin(BeginMode.Quads); 

      GL.TexCoord2(0, 0); 
      GL.Vertex3(0, 0, 0); 

      GL.TexCoord2(1, 0); 
      GL.Vertex3(256, 0, 0); 

      GL.TexCoord2(1, 1); 
      GL.Vertex3(256, 256, 0); 

      GL.TexCoord2(0, 1); 
      GL.Vertex3(0, 256, 0); 

      GL.End(); 

      GL.Disable(EnableCap.Texture2D); 
      GL.PopMatrix(); 

      GL.MatrixMode(MatrixMode.Projection); 
      GL.PopMatrix(); 

      GL.MatrixMode(MatrixMode.Modelview); 
     } 

     protected override void OnRenderFrame(FrameEventArgs e) 
     { 
      GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); 

      DrawImage(texture); 

      SwapBuffers(); 
     } 
    } 

    public class Program 
    { 
     [STAThread] 
     public static void Main() 
     { 
      using (FailRender win = new FailRender()) 
      { 
       win.Run(); 
      } 
     } 
    } 
} 

答えて

4

「GL.Color4(1,0,0,1);」という行を削除すると、

とに負荷テクスチャ機能を変更する:

public int LoadTexture(string file) 
{ 
    Bitmap bitmap = new Bitmap(file); 

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

    GL.GenTextures(1, out tex); 
    GL.BindTexture(TextureTarget.Texture2D, tex); 

    BitmapData data = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.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); 
    bitmap.UnlockBits(data); 


    GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int) TextureMinFilter.Linear); 
    GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int) TextureMagFilter.Linear); 
    GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int) TextureWrapMode.Repeat); 
    GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int) TextureWrapMode.Repeat); 

    return tex; 
} 

修正問題。 System.Drawing.PixelFormat.ArgbはOpenGL形式Bgraとなります。

+0

Argbの使用は、行列が正しい順序でプッシュ/ポップされていることを確認している場合にも機能します。これは私にも迷惑をかけましたが、自由を許しています。 –

関連する問題