2014-11-11 4 views
1

파일에서 이미지를 읽고 OpenGL 텍스처로 매핑하려고합니다. OpenCV는 이미지를 바로 읽고 거기에서 만든 창에 이미지를 표시합니다. 텍스처 매핑 부분이 작동하지 않습니다. 이유를 찾을 수 없습니다. 내 코드는 다음과 같습니다.텍스처 바인딩 : OpenGL + OpenCV

int InitGL(GLvoid){ 

    try 
    { 
     Mat img = imread("aaa.jpg", CV_LOAD_IMAGE_ANYDEPTH); 
     if (&img != NULL) 
     { 
      namedWindow("Show Image", CV_WINDOW_AUTOSIZE); 
      imshow("Show Image", img); 
     } 
     glGenTextures(1, texture); 
     glBindTexture(GL_TEXTURE_2D, texture[0]); 
     glTexImage2D(GL_TEXTURE_2D, 0, 3, img.cols, img.rows, 0, GL_RGB, GL_UNSIGNED_BYTE, img.data); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
     img.release(); 
    } 
    catch (Exception e) 
    { 
     cout << "My Msg: " +e.msg << endl; 
    } 

    glEnable(GL_TEXTURE_2D); 
    glShadeModel(GL_SMOOTH);    // enabling smooth shader 
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // black background 

    glClearDepth(1.0f);     // depth buffer setup 
    glEnable(GL_DEPTH_TEST);    // enable depth testing 
    glDepthFunc(GL_LEQUAL);    // the type of depth test to do 

    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);  
    return TRUE;       // initialization went ok 
} 

int DrawGLScene(GLvoid){ 


    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);   // Clear The Screen And The Depth Buffer 
    glLoadIdentity(); 
    glTranslatef(0.0f, 0.0f, -6.0f);     // Move Right 3 Units 
    glRotatef(rotationQuad, 1.0f, 0.0f, 0.0f); 
    glBindTexture(GL_TEXTURE_2D, texture[0]); 
    glBegin(GL_QUADS); 
     // Front Face 
     glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // Bottom Left Of The Texture and Quad 
     glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, -1.0f, 1.0f); // Bottom Right Of The Texture and Quad 
     glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 1.0f, 1.0f); // Top Right Of The Texture and Quad 
     glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Top Left Of The Texture and Quad 
     // Back Face 
     glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // Bottom Right Of The Texture and Quad 
     glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); // Top Right Of The Texture and Quad 
     glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f, 1.0f, -1.0f); // Top Left Of The Texture and Quad 
     glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, -1.0f, -1.0f); // Bottom Left Of The Texture and Quad 
     // Top Face 
     glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); // Top Left Of The Texture and Quad 
     glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Bottom Left Of The Texture and Quad 
     glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, 1.0f, 1.0f); // Bottom Right Of The Texture and Quad 
     glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 1.0f, -1.0f); // Top Right Of The Texture and Quad 
     // Bottom Face 
     glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // Top Right Of The Texture and Quad 
     glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f, -1.0f, -1.0f); // Top Left Of The Texture and Quad 
     glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, -1.0f, 1.0f); // Bottom Left Of The Texture and Quad 
     glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // Bottom Right Of The Texture and Quad 
    // Right face 
     glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, -1.0f, -1.0f); // Bottom Right Of The Texture and Quad 
     glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 1.0f, -1.0f); // Top Right Of The Texture and Quad 
     glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f, 1.0f, 1.0f); // Top Left Of The Texture and Quad 
     glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, -1.0f, 1.0f); // Bottom Left Of The Texture and Quad 
    // Left Face 
     glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // Bottom Left Of The Texture and Quad 
     glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // Bottom Right Of The Texture and Quad 
     glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Top Right Of The Texture and Quad 
     glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); // Top Left Of The Texture and Quad 
    glEnd();       // Done Drawing The Quad 

    rotationQuad -= 0.15f; 
    return TRUE;         // Everything Went OK 
} 

OpenCV로 만든 창에 이미지가 표시됩니다. 이미지가 올바르게 읽혔는지 여부를 디버깅하고 테스트합니다. 입방체는 질감이있는 것으로 가정되었습니다. 그러나 그것에 텍스처가 보이지 않습니다.

+0

다음을 사용하십시오. 'if (! img.empty())'를 확인하면 매트의 주소가 항상 유효합니다. – berak

+0

그 부분은 잘 작동합니다. 텍스처 바인딩 부분이 작동하지 않습니다 ... :(@berak –

+0

이미지의 해상도는 무엇입니까? 아마도 "2의 제곱수"또는 몇 가지 유사한 제한 사항이어야합니다. – Micka

답변

0

사용 :
glGenTextures(1, &texture[0]);
대신 : glGenTexures(1, texture);

그것을 해결했다.