2011-06-22 197 views
3

我正在學習如何在openGL中應用紋理。 我將紋理應用於立方體的一個面,並使用原始顏色對其他面進行着色。 在我應用紋理之前,顏色看起來很好,而且在應用之後它們變得更暗。 有什麼不對?openGL紋理和顏色

void LoadGLTextures() { 
    // Load Texture 
    Image *image1; 
    // allocate space for texture 
    image1 = (Image *) malloc(sizeof(Image)); 
    if (image1 == NULL) { 
    printf("Error allocating space for image"); 
    exit(0); 
    } 

    if (!ImageLoad("dd.bmp", image1)) { 
    exit(1); 
    } 

    // Create Texture 
    glGenTextures(1, &texture[0]); 
    glBindTexture(GL_TEXTURE_2D, texture[0]); // 2d texture (x and y size) 

    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); // scale linearly when image bigger than texture 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); // scale linearly when image smalled than texture 

    // 2d texture, level of detail 0 (normal), 3 components (red, green, blue), x size from image, y size from image, 
    // border 0 (normal), rgb color data, unsigned byte data, and finally the data itself. 
    glTexImage2D(GL_TEXTURE_2D, 0, 3, image1->sizeX, image1->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, image1->data); 
} 


int main() 
{ 
sf::Window App(sf::VideoMode(600, 600, 32), "SFML OpenGL", sf::Style::Close); 
glEnable(GL_DEPTH_TEST); 
glDepthMask(GL_TRUE); 
glDepthFunc(GL_LEQUAL); 
glEnable(GL_TEXTURE_2D); 
glShadeModel(GL_SMOOTH); 
LoadGLTextures(); 
glBindTexture(GL_TEXTURE_2D, texture[0]); 
while (App.IsOpened()) 
{ 
    App.SetActive(); 
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
    glBegin(GL_QUADS); 
    //back 
    glColor3f(0.0f,0.0f,0.0f); //cyan 
    glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.2f,0.2f,0.2f); //top left 
    glTexCoord2f(1.0f, 1.0f); glVertex3f(0.2f,0.2f,0.2f); //top right 
    glTexCoord2f(1.0f, 0.0f); glVertex3f(0.2f,-0.2f,0.2f); //bottom right 
    glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.2f,-0.2f,0.2f); //bottom left 
    //bottom 
    glColor3f(0.0f,1.0f,0.0f); //green 
    glVertex3f(0.2f,-0.2f,0.2f); //back right 
    glVertex3f(-0.2f,-0.2f,0.2f); //back left 
    glVertex3f(-0.2f,-0.2f,-0.2f); //front left 
    glVertex3f(0.2f,-0.2f,-0.2f); //front right 
    //front 
    glColor3f(0.0f,0.0f,1.0f); //blue 
    glVertex3f(0.2f,-0.2f,-0.2f); //bottom right 
    glVertex3f(-0.2f,-0.2f,-0.2f); //bottom left 
    glVertex3f(-0.2f,0.2f,-0.2f); //top left 
    glVertex3f(0.2f,0.2f,-0.2f); //top right 
    //top 
    glColor3f(1.0f,1.0f,0.0f); //yellow 
    glVertex3f(0.2f,0.2f,-0.2f); //front right 
    glVertex3f(-0.2f,0.2f,-0.2f); //front left 
    glVertex3f(-0.2f,0.2f,0.2f); //back left 
    glVertex3f(0.2f,0.2f,0.2f); //back right 
    //left 
    glColor3f(0.0f,1.0f,1.0f); //pink 
    glVertex3f(-0.2f,-0.2f,-0.2f); //bottom front 
    glVertex3f(-0.2f,-0.2f,0.2f); //bottom back 
    glVertex3f(-0.2f,0.2f,0.2f); //top back 
    glVertex3f(-0.2f,0.2f,-0.2f); //top front 
    //right 
    glColor3f(1.0f,0.0f,0.0f); //red 
    glVertex3f(0.2f,-0.2f,-0.2f); //bottom front 
    glVertex3f(0.2f,-0.2f,0.2f); //bottom back 
    glVertex3f(0.2f,0.2f,0.2f); //top back 
    glVertex3f(0.2f,0.2f,-0.2f); //top front 
    glEnd(); 

    glFlush(); 

    App.Display(); 

    sf::Event Event; 
    while (App.GetEvent(Event)) 
    { 
     if (Event.Type == sf::Event::Closed) 
      App.Close(); 
     if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::Escape)) 
      App.Close(); 
     if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::Right)) 
      glRotated(20.0d,0.0d,0.2d,0.0d); 
     if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::Left)) 
      glRotated(-20.0d,0.0d,0.2d,0.0d); 
     if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::Up)) 
      glRotated(20.0d,0.2d,0.0d,0.0d); 
     if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::Down)) 
      glRotated(-20.0d,0.2d,0.0d,0.0d); 
     if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::PageUp)) 
      glRotated(20.0d,0.0d,0.0d,0.2d); 
     if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::PageDown)) 
      glRotated(-20.0d,0.0d,0.0d,0.2d); 
    } 
} 
return EXIT_SUCCESS; 
} 
+3

你是如何產生的立方體和紋理的臉?如果您發佈了一些代碼,可能會更容易回答您的問題。 – hughes

+1

你能告訴我們一些代碼,也許是一張圖片嗎? Thx –

+0

好的,我看到'LoadGLTextures()'函數,但是在哪裏生成幾何? – hughes

回答

2

嘗試在繪製紋理面之前啓用GL_TEXTURE2D,然後立即將其禁用。

... 
//back 
glEnable(GL_TEXTURE2D); 
glBegin(GL_QUADS); 
glColor3f(0.0f,0.0f,0.0f); //cyan 
glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.2f,0.2f,0.2f); //top left 
glTexCoord2f(1.0f, 1.0f); glVertex3f(0.2f,0.2f,0.2f); //top right 
glTexCoord2f(1.0f, 0.0f); glVertex3f(0.2f,-0.2f,0.2f); //bottom right 
glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.2f,-0.2f,0.2f); //bottom left 
glEnd(); 
glDisable(GL_TEXTURE2D); 
glBegin(GL_QUADS); 
//bottom 
... 
+0

我試過了,它不起作用 – wbaccari

+0

'glBegin(...)'/'glEnd()'塊中不允許使用'glEnable(...)'/'glDisable(...)'。 – datenwolf

+0

-1:不正確的OpenGL。正如Datenwolf所說,你不能激活或停用glBegin/glEnd中間的紋理。 –

5

OpenGL是一個狀態機。這意味着最後的紋理座標集將應用於所有後續的頂點。因此,即使您停止提供紋理座標,它仍然會在應用於整個面的最後設置的紋理座標上應用紋理的顏色。

要停止紋理你有glDisable(GL_TEXTURE_2D);禁用紋理把它在你的代碼:

// ... 
App.SetActive(); 
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 

glEnable(GL_TEXTURE_2D); // <- enable texturing for the one face 
glBegin(GL_QUADS); 
//back 
glColor3f(0.0f,0.0f,0.0f); //cyan 
glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.2f,0.2f,0.2f); //top left 
glTexCoord2f(1.0f, 1.0f); glVertex3f(0.2f,0.2f,0.2f); //top right 
glTexCoord2f(1.0f, 0.0f); glVertex3f(0.2f,-0.2f,0.2f); //bottom right 
glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.2f,-0.2f,0.2f); //bottom left 
glEnd(); // <- first end the current primitive list 

glDisable(GL_TEXTURE_2D); // <- disable texturing for the rest of the faces 
glBegin(GL_QUADS); 
//bottom 
glColor3f(0.0f,1.0f,0.0f); //green 
glVertex3f(0.2f,-0.2f,0.2f); //back right 
glVertex3f(-0.2f,-0.2f,0.2f); //back left 
glVertex3f(-0.2f,-0.2f,-0.2f); //front left 
glVertex3f(0.2f,-0.2f,-0.2f); //front right 
//front 

//... 
+0

啓用後,您需要綁定到紋理 –

+0

@BЈовић:我故意忽略該部分。紋理也不會通過禁用紋理來解除綁定。 – datenwolf

+0

好吧,我只是比較你和他的解決方案(他張貼爲其他答案)。他的不同僅在於綁定。但看着他的問題,我看到他在產生紋理後會綁定 –

0

你是絕對正確的,這裏現在是正確的代碼:

glEnable(GL_TEXTURE_2D); 
    glBindTexture(GL_TEXTURE_2D, texture); 
    glBegin(GL_QUADS); 
    //back 
    glColor3f(1.0f,1.0f,1.0f); //white 
    glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.2f,0.2f,0.2f); //top left 
    glTexCoord2f(1.0f, 1.0f); glVertex3f(0.2f,0.2f,0.2f); //top right 
    glTexCoord2f(1.0f, 0.0f); glVertex3f(0.2f,-0.2f,0.2f); //bottom right 
    glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.2f,-0.2f,0.2f); //bottom left 
    glEnd(); 
    glDisable(GL_TEXTURE_2D); 
    glBegin(GL_QUADS); 
    //bottom 
    glColor3f(0.0f,1.0f,0.0f); //green 
    glVertex3f(0.2f,-0.2f,0.2f); //back right 
    glVertex3f(-0.2f,-0.2f,0.2f); //back left 
    glVertex3f(-0.2f,-0.2f,-0.2f); //front left 
    glVertex3f(0.2f,-0.2f,-0.2f); //front right 
    //front 
    glColor3f(0.0f,0.0f,1.0f); //blue 
    glVertex3f(0.2f,-0.2f,-0.2f); //bottom right 
    glVertex3f(-0.2f,-0.2f,-0.2f); //bottom left 
    glVertex3f(-0.2f,0.2f,-0.2f); //top left 
    glVertex3f(0.2f,0.2f,-0.2f); //top right 
    //top 
    glColor3f(1.0f,1.0f,0.0f); //yellow 
    glVertex3f(0.2f,0.2f,-0.2f); //front right 
    glVertex3f(-0.2f,0.2f,-0.2f); //front left 
    glVertex3f(-0.2f,0.2f,0.2f); //back left 
    glVertex3f(0.2f,0.2f,0.2f); //back right 
    //left 
    glColor3f(0.0f,1.0f,1.0f); //pink 
    glVertex3f(-0.2f,-0.2f,-0.2f); //bottom front 
    glVertex3f(-0.2f,-0.2f,0.2f); //bottom back 
    glVertex3f(-0.2f,0.2f,0.2f); //top back 
    glVertex3f(-0.2f,0.2f,-0.2f); //top front 
    //right 
    glColor3f(1.0f,0.0f,0.0f); //red 
    glVertex3f(0.2f,-0.2f,-0.2f); //bottom front 
    glVertex3f(0.2f,-0.2f,0.2f); //bottom back 
    glVertex3f(0.2f,0.2f,0.2f); //top back 
    glVertex3f(0.2f,0.2f,-0.2f); //top front 
    glEnd();