2013-05-05 36 views
0

我有这个立方体,我想用不同的图像来覆盖它的每一面,其中出现一个字母。用不同的图像覆盖立方体的每一面 - OpenGL

enter image description here

我的问题是立方体由相同的图像覆盖,你可以在下面的图片看。 但我希望字母A出现在顶部,B在左侧,C在右侧。

enter image description here

以转化/变换图像(字母A,B,C)中的纹理我使用此代码:

glGenTextures(1, textureA); 
    glGenTextures(1, textureB); 
    glGenTextures(1, textureC); 
    glClearColor (0.0, 0.0, 0.0, 0.0); 
     if (flagA ==1){ 
      cvtColor(imageA, imageA, CV_BGR2RGB); 
      glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST); 
      glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
      glBindTexture(GL_TEXTURE_2D, textureA); 
      glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
      glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
      //glTexImage2D(GL_TEXTURE_2D, 0, 4,image.cols, image.rows, 0, GL_RGB,GL_UNSIGNED_BYTE, image.data); 
      gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, imageA.cols, imageA.rows, GL_RGB, GL_UNSIGNED_BYTE, imageA.data); 
     } 
     if (flagC ==1){ 
      cvtColor(imageC, imageC, CV_BGR2RGB); 
      glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST); 
      glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
      glBindTexture(GL_TEXTURE_2D, textureC); 
      glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
      glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
      //glTexImage2D(GL_TEXTURE_2D, 0, 4,image.cols, image.rows, 0, GL_RGB,GL_UNSIGNED_BYTE, image.data); 
      gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, imageC.cols, imageC.rows, GL_RGB, GL_UNSIGNED_BYTE, imageC.data); 
     } 
     if (flagB ==1){ 
      cvtColor(imageB, imageB, CV_BGR2RGB); 
      glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST); 
      glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
      glBindTexture(GL_TEXTURE_2D, textureB); 
      glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
      glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
      //glTexImage2D(GL_TEXTURE_2D, 0, 4,image.cols, image.rows, 0, GL_RGB,GL_UNSIGNED_BYTE, image.data); 
      gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, imageB.cols, imageB.rows, GL_RGB, GL_UNSIGNED_BYTE, imageB.data); 
     } 

我指出,如果切换方框if(flagB==1){...}if(flagC==1){...}(在这种方式与C字母图像是最后的图像纹理转换过程中),我的立方体只有C字母覆盖。

为什么这种奇怪的行为?

为了显示结果,我用这个代码:

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

glMatrixMode (GL_PROJECTION); 
glLoadIdentity(); 
gluOrtho2D(0, WIDTH, HEIGHT, 0); 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

if(flagA==1){ 
    glBindTexture(GL_TEXTURE_2D, textureA); 
    glBegin(GL_QUADS); 
    glTexCoord2f(0.0f, 0.0f); glVertex2f((GLfloat)((A[3].x)),(GLfloat)(A[3].y)); 
    glTexCoord2f(1.0f, 0.0f); glVertex2f((GLfloat)((A[0].x)),(GLfloat)(A[0].y)); 
    glTexCoord2f(1.0f, 1.0f); glVertex2f((GLfloat)((A[1].x)),(GLfloat)(A[1].y)); 
    glTexCoord2f(0.0f, 1.0f); glVertex2f((GLfloat)((A[2].x)),(GLfloat)(A[2].y)); 
    glEnd(); 
    } 
    if(flagB==1){ 
    glBindTexture(GL_TEXTURE_2D, textureB); 
    glBegin(GL_QUADS); 
    glTexCoord2f(0.0f, 0.0f); glVertex2f((GLfloat)((B[3].x)),(GLfloat)(B[3].y)); 
    glTexCoord2f(1.0f, 0.0f); glVertex2f((GLfloat)((B[0].x)),(GLfloat)(B[0].y)); 
    glTexCoord2f(1.0f, 1.0f); glVertex2f((GLfloat)((B[1].x)),(GLfloat)(B[1].y)); 
    glTexCoord2f(0.0f, 1.0f); glVertex2f((GLfloat)((B[2].x)),(GLfloat)(B[2].y)); 
    glEnd(); 
    } 
    if(flagC==1){ 
    glBindTexture(GL_TEXTURE_2D, textureC); 
    glBegin(GL_QUADS); 
    glTexCoord2f(0.0f, 0.0f); glVertex2f((GLfloat)((C[3].x)),(GLfloat)(C[3].y)); 
    glTexCoord2f(1.0f, 0.0f); glVertex2f((GLfloat)((C[0].x)),(GLfloat)(C[0].y)); 
    glTexCoord2f(1.0f, 1.0f); glVertex2f((GLfloat)((C[1].x)),(GLfloat)(C[1].y)); 
    glTexCoord2f(0.0f, 1.0f); glVertex2f((GLfloat)((C[2].x)),(GLfloat)(C[2].y)); 
    glEnd(); 
    } 

我的windows7上的x64和OpenGL工作。

回答

0

我们看不到您的渲染代码。

你是否在某处写了这个文件来生成纹理ID?

glGenTextures(1, &textureA); 
glGenTextures(1, &textureB); 
glGenTextures(1, &textureC); 

您是在渲染立方体时编写的?

glBindTexture(GL_TEXTURE_2D, textureA); 
// Draw the A face 

glBindTexture(GL_TEXTURE_2D, textureB); 
// Draw the B face 

glBindTexture(GL_TEXTURE_2D, textureC); 

//绘制C面

+0

我更新了我的答案。 – Cristina1986 2013-05-05 16:42:04

0

什么,你正在做的是:

glGenTextures(1, textureA); 
glGenTextures(1, textureB); 
glGenTextures(1, textureC); 

它应该是:

glGenTextures(1, &textureA); 
glGenTextures(1, &textureB); 
glGenTextures(1, &textureC); 

我认为这个问题是因为变量textureA ,textureB和textureC不会得到有效的值,因此glBindTexture调用什么也不做(尽管如此我认为你应该得到分段错误)。

相关问题