2011-11-11 3 views
2

OpenCV를 사용하여 웹캠 데이터를 캡쳐하고 GL 윈도우 용 텍스처로 표시합니다. 괜찮습니다.OpenGL의 텍스처 위에 2D 모양을 표시합니다.

gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, image->width, image->height, GL_RGB, GL_UNSIGNED_BYTE, image->imageData); 

은 그러나 나는 또한 백그라운드에서와 같은 창 자체의 질감을 유지,이 위에 몇 가지 기본적인 형태, (Md2)과 모델을 오버레이합니다. 새로운 질서와 좌표 :

glDisable(GL_TEXTURE_2D); 
glBegin(GL_QUADS); 
// Trapezoid to be displayed on top of texture 
glVertex3f(0.2f, 0.3f, -0.6f); 
glVertex3f(0.5f, -0.5f, -0.5f); 
glVertex3f(0.4f, -0.5f, -0.5f); 
glVertex3f(-0.4f, -0.5f, -0.5f); 
glEnd(); //End quadrilateral coordinates 
//// 
glEnable(GL_TEXTURE_2D); // start drawing the background texture 
glBegin(GL_QUADS); 
glTexCoord2f(0.0f, 0.0f); glVertex2f(0.0f, 0.0f); 
glTexCoord2f(1.0f, 0.0f); glVertex2f(VIEWPORT_WIDTH, 0.0f); 
glTexCoord2f(1.0f, 1.0f); glVertex2f(VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 
glTexCoord2f(0.0f, 1.0f); glVertex2f(0.0f, VIEWPORT_HEIGHT); 
glEnd(); 

glutDisplayFunc()

void drawScene() { 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glEnable(GL_TEXTURE_2D); 

    // Set Projection Matrix 
    glMatrixMode (GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D(0, VIEWPORT_WIDTH, VIEWPORT_HEIGHT, 0); 

    // Setup the view // Switch to Model View Matrix 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glBegin(GL_QUADS); 
    // Trapezoid 
    glVertex3f(-0.7f, -1.5f, -5.0f); 
    glVertex3f(0.7f, -1.5f, -5.0f); 
    glVertex3f(0.4f, -0.5f, -5.0f); 
    glVertex3f(-0.4f, -0.5f, -5.0f); 
    glEnd(); //End quadrilateral coordinates 

    // start drawing the Background texture 
    glBegin(GL_QUADS); 
    glTexCoord2f(0.0f, 0.0f); glVertex2f(0.0f, 0.0f); 
    glTexCoord2f(1.0f, 0.0f); glVertex2f(VIEWPORT_WIDTH, 0.0f); 
    glTexCoord2f(1.0f, 1.0f); glVertex2f(VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 
    glTexCoord2f(0.0f, 1.0f); glVertex2f(0.0f, VIEWPORT_HEIGHT); 
    glEnd(); 

    glFlush(); 
    glutSwapBuffers(); 
} 

편집 새로운 질서

glBegin(GL_QUADS); 
    glTexCoord2f(0.0f, 0.0f); glVertex2f(0.0f, 0.0f); 
    glTexCoord2f(1.0f, 0.0f); glVertex2f(VIEWPORT_WIDTH, 0.0f); 
    glTexCoord2f(1.0f, 1.0f); glVertex2f(VIEWPORT_WIDTH, VIEWPORT_HEIGHT); 
    glTexCoord2f(0.0f, 1.0f); glVertex2f(0.0f, VIEWPORT_HEIGHT); 
    glEnd(); 

    glBegin(GL_QUADS); //Begin quadrilateral coordinates 
    // Trapezoid 
    glVertex3f(-0.7f, -1.5f, -5.0f); 
    glVertex3f(0.7f, -1.5f, -5.0f); 
    glVertex3f(0.4f, -0.5f, -5.0f); 
    glVertex3f(-0.4f, -0.5f, -5.0f); 
    glEnd(); //End quadrilateral coordinates 

편집에 전달되어 제 기능입니다

결과 위의 일을하고 gluOrtho2D()

enter image description here

+1

수 너 뭐가 잘못 됐는지 말해 줄거야? 내가보기에 모델을로드하고 표시하기 위해 몇 가지 추가 코드가 필요한 작업 프로그램이 있습니다. – NickLH

+0

+1 즉시 답장. 얻을 수있는 것은 모두 배경 텍스처입니다. 2D 모양은 보이지 않습니다. 그게 다야. :) – coder9

+0

아, 사다리꼴을 그린 후에 배경 텍스처를 그립니다. 그러므로 그것은 그것들을 이끌고 있습니다. 그리기 순서를 반대로하면 효과가 있습니다. – NickLH

답변

1

체크 gluOrtho2D() 용 문서는 :

gluOrtho2D 이차원 직교 뷰잉 영역을 설정한다. 이 = 근처에 glOrtho를 호출하는 것과 같습니다 -1까지 = 1

당신은 당신의 가까운 클리핑 평면 뒤에 Z = -5, 방법에 당신의 사다리꼴을 배치하고

:

glBegin(GL_QUADS); 
glVertex3f(-0.7f, -1.5f, -5.0f); 
glVertex3f(0.7f, -1.5f, -5.0f); 
glVertex3f(0.4f, -0.5f, -5.0f); 
glVertex3f(-0.4f, -0.5f, -5.0f); 
glEnd(); 

시도 - 당신의 Z 좌표 0.5, 또는 -1과 0

EDIT 사이에 적어도 뭔가 : 예 :

#include <GL/glut.h> 

int win_w = 0; 
int win_h = 0; 
GLuint texObj = 0; 

void display(void) 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    // set up projection 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    double halfWidth = (win_w/2.0);; 
    double halfHeight = (win_h/2.0); 
    glOrtho(-halfWidth, halfWidth, -halfHeight, halfHeight, -10, 10); 

    // set up modelview 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    // render textured quad 
    glEnable(GL_TEXTURE_2D); 
    glColor3ub(255,255,255); 
    glPushMatrix(); 
     glScalef(halfWidth * 0.9, halfHeight * 0.9, 1.0); 
     glBegin(GL_QUADS); 
      glTexCoord2f(0,0); 
      glVertex2f(-1,-1); 
      glTexCoord2f(1,0); 
      glVertex2f(1,-1); 
      glTexCoord2f(1,1); 
      glVertex2f(1,1); 
      glTexCoord2f(0,1); 
      glVertex2f(-1,1); 
     glEnd(); 
    glPopMatrix(); 
    glDisable(GL_TEXTURE_2D); 

    // draw quad on top 
    glColor3ub(255,0,0); 
    glPushMatrix(); 
     // move quad back a bit so it's above Z=0 
     glTranslatef(0,0,-1); 
     glScalef(50,50,50); 
     glBegin(GL_QUADS); 
      glVertex2f(-1,-1); 
      glVertex2f(1,-1); 
      glVertex2f(1,1); 
      glVertex2f(-1,1); 
     glEnd(); 
    glPopMatrix(); 

    glFlush(); 
    glutSwapBuffers(); 
} 

void reshape(int w, int h) 
{ 
    win_w = w; 
    win_h = h; 
    glViewport(0, 0, w, h); 
} 

GLuint getTexture() 
{ 
    // 2x2 texture 
    unsigned char bytes[] = 
    { 
      0, 0, 255,  255, 255, 255, 
     255, 0, 0,  0, 255, 0, 
    }; 

    GLuint texID; 
    glGenTextures(1, &texID); 
    glBindTexture(GL_TEXTURE_2D, texID); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, bytes); 
    return texID; 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE); 

    glutInitWindowSize(800,600); 
    glutCreateWindow("Texture"); 

    glutDisplayFunc(display); 
    glutReshapeFunc(reshape); 

    texObj = getTexture(); 
    glutMainLoop(); 
    return 0; 
} 
+0

+1. 당신이 말한 것을 한 후에 나는 위의 결과로 끝났습니다. 제 수정 된 섹션의 스크린 샷을보십시오. – coder9

+0

@ coder9 : 예제 프로그램이 추가되었습니다. – genpfault

+0

고마워요! 감촉이 거꾸로되어 있습니다. 나는 그것을 고치려고 노력할 것입니다! – coder9

1

당신이 당신의 사다리꼴과 같은 질감해서는 안 일을 그리기하는 경우 텍스처링 (glDisable(GL_TEXTURE_2D))를 해제해야합니다 해제 후.

그렇지 않으면 마지막으로 설정된 텍스처 좌표가 모든 새로운 꼭지점에 적용되어 이상한 곳에서 텍스처를 샘플링합니다.

+0

그것도 작동하지 않습니다. glTisable (GL_TEXTURE_2D) 전에 사다리꼴 및 glEnable (GL_TEXTURE_2D) 텍스처의 glTexCoord2f() 줄 전에 호출 해보십시오. 여전히 보여줍니다. 텍스처 만 사용하십시오 – coder9

+0

@ coder9 : glBegin (...) -glEnd() 블록의 _outside_라고 지정하십시오 .. BTW : 어쨌든 즉 치 모드 (glBegin (...) -glEnd())를 사용하면 안됩니다. OpenGL-2는 텍스처 이미지에 임의의 크기를 사용할 수 있기 때문에 gluBuild2DMipmap을 사용하는 데는 거의 사용하지 않습니다. 밉맵을 사용하지 않고 레벨 0 만 업로드하면됩니다. – datenwolf

+0

@datenwolf 안녕하세요. '오직 업로드 레벨 0 '이란 무엇을 의미합니까? 당신은 몇 가지 골격 코드를 게시 할 수 있습니까? – coder9

관련 문제