0

OpenGLを使用した簡単なテストを作成しようとしていTao.Frameworkます。テクスチャで正方形を描く必要があります。これまでのところ、私はこれに来ました:

private void simpleOpenGlControl1_Paint(object sender, PaintEventArgs e)
{
    simpleOpenGlControl1.InitializeContexts();

    Gl.glClearColor(0f, 0f, 0f, 0f);
    Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
    Gl.glOrtho(-1, 2, -1, 2, 1, -1);

    // Open image
    var fileName = @"C:\mypath\image.bmp";
    var bmp = new Bitmap(fileName);
    var bmpData = bmp.LockBits(
        new Rectangle(0, 0, bmp.Width, bmp.Height),
        ImageLockMode.ReadOnly,
        PixelFormat.Format24bppRgb);

    // Texture
    Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, (int)Gl.GL_RGB8,
        bmp.Width, bmp.Height, 0, Gl.GL_BGR_EXT,
        Gl.GL_UNSIGNED_BYTE, bmpData.Scan0);

    Gl.glBindTexture(Gl.GL_TEXTURE_2D, 0);

    // Draw a square.
    Gl.glBegin(Gl.GL_POLYGON);
        Gl.glVertex2f(0, 0);
        Gl.glVertex2f(0, 1);
        Gl.glVertex2f(1, 1);
        Gl.glVertex2f(1, 0);
    Gl.glEnd();
}

正方形は予想どおりの形状でレンダリングされますが、テクスチャはありません。私は の新人でOpenGL、さらにTao.Framework. どうすれば修正できますか?または、テクスチャを追加する正しい方法は?

EDITED
@jpの助けを借りて、私はこれを試しています:

    //...
    Gl.glEnable(Gl.GL_TEXTURE_2D);

    // Draw a square.
    Gl.glBegin(Gl.GL_POLYGON);

    Gl.glTexCoord2f(0, 0); Gl.glVertex2f(0, 0);
    Gl.glTexCoord2f(0, 1); Gl.glVertex2f(0, 1);
    Gl.glTexCoord2f(1, 1); Gl.glVertex2f(1, 1);
    Gl.glTexCoord2f(1, 0); Gl.glVertex2f(1, 0);

    Gl.glEnd();

しかし、正方形はテクスチャなしで保持されます。

4

1 に答える 1

4

あなたは少なくとも恋しい

GL.Enable(GL.TEXTURE2D);

デフォルトでは有効になっていません。

また、以下を呼び出して新しいテクスチャ スロットを生成する必要があります。

int texID;
Gl.glGenTextures(1, texID); //where 1 is the count, and texID a new texture slot in the gpu

次に、それ以降のすべての操作が適用されるテクスチャ スロットをバインドする必要があります。

Gl.glBindTexture(Gl.GL_TEXTURE_2D, texID);

Gl.glBindTexture(Gl.GL_TEXTURE_2D, 0); を呼び出すことに注意してください。現在のテクスチャを無効にします。

これ以降のすべての操作はそのテクスチャに向けられるため、次を呼び出してビットマップ データをそのテクスチャ スロットに渡すことができます。

Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, (int)Gl.GL_RGB8,
    bmp.Width, bmp.Height, 0, Gl.GL_BGR_EXT,
    Gl.GL_UNSIGNED_BYTE, bmpData.Scan0);

texGen やクランプなどのテクスチャ パラメータを設定したい場合は、次のようにします。例:

Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR);
Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);

頂点宣言にはテクスチャ座標も含める必要があります。または、テクスチャ座標生成をアクティブに設定する必要があります。

    GL.TexCoord(0,1); Gl.glVertex2f(0, 0);
    GL.TexCoord(0,0); Gl.glVertex2f(0, 1);
    GL.TexCoord(1,0); Gl.glVertex2f(1, 1);
    GL.TexCoord(1,1); Gl.glVertex2f(1, 0);

これらの座標を自動的に生成したい場合は、GL.TexCoord 呼び出しを省略して、次の方法で有効にすることができます。

Gl.glEnable(Gl.GL_TEXTURE_GEN_S); //enable texture coordinate generation
Gl.glEnable(Gl.GL_TEXTURE_GEN_T);

Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_CLAMP);
Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_CLAMP);

ビットマップ データのロックを解除することを忘れないでください (ガベージ コレクターが必須であっても)。

bmp.Unlock(bmpData);
于 2014-03-24T17:27:30.513 に答える