2014-03-24 46 views
0

使用紋理繪製正方形我正在嘗試使用Tao.Framework生成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(); 
} 

正方形呈現在預期的形狀,但沒有紋理。我是OpenGLTao.Framework甚至更​​多。我該如何解決它?或者如何添加紋理的正確方法?

EDITED
隨着@ J-p I將是幫助試試這個:

//... 
    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(); 

但方繼續使用,無需質感。

+0

有很多工作要做:-) –

回答

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); 

,如果你希望這些座標被automaticaly產生可以省略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); 
+0

感謝您的幫助,但我儘量不工作。還有別的東西,我錯過了? –

+0

我用你的建議更新了這個問題。 –

+0

謝謝,現在工作。但是我的形象是顛倒的。這是默認的?我可以改變它嗎? –