2014-03-24 1 views
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입니다. 어떻게 해결할 수 있습니까? 또는 텍스처를 추가하는 올바른 방법은 무엇입니까?

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

그러나 사각형 텍스처없이 유지 : 난 @ j를-P의 도움으로
편집

이보십시오.

+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.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); 
+0

도움을 주셔서 감사합니다.하지만 노력하고 있습니다. 제가 놓친 다른 것이 있습니다. –

+0

귀하의 제안으로 질문을 업데이트했습니다. –

+0

감사합니다. 이제 작업하십시오. 그러나 내 이미지는 거꾸로되어 있습니다. 이것이 기본값입니까? 내가 바꿀 수있어? –