2010-09-16 79 views
0

我有兩個紋理映射到一個表面,一個是棋盤格(地板上的圖案),另一個是光照貼圖,兩者都混合並呈現得很好。我遇到的麻煩是在混合前將光照貼圖紋理轉換。我需要這樣做,所以我可以模擬在地板上手電筒掃描....OpenGL紋理混合和轉換

代碼:

//Floor - Checkerboard 
    float fF = 3.0; //Floor Factor 

    //Checkerboard texture 
    glActiveTexture(GL_TEXTURE0); 
    glEnable(GL_TEXTURE_2D); 
    glBindTexture(GL_TEXTURE_2D, textures[0]); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);//turn on mipmapping 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 
    //Spotlight, modulate on checkerboard 
    glActiveTexture(GL_TEXTURE1); 
    glEnable(GL_TEXTURE_2D); 
    glBindTexture(GL_TEXTURE_2D, textures[4]); 
    **glPushMatrix(); 
    glMatrixMode(GL_TEXTURE); 
    glLoadIdentity(); 
    glTranslatef(5.0, 5.0, 0.0); 
    glMatrixMode(GL_MODELVIEW); 
    glPopMatrix();** 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND); 

    float vals[4] = {0.0, 0.0, 0.0, 0.5}; 

    glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, vals); 
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); 
    glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE); 
    glTexEnvf(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS); 
    glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); 
    glTexEnvf(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE); 
    glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); 
    glTexEnvf(GL_TEXTURE_ENV, GL_SRC2_RGB, GL_CONSTANT); 
    glTexEnvf(GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_ALPHA); 

    float spot_x = 1; 
    float spot_y = 1; 

    glBegin(GL_QUADS); 
    glNormal3d(0, 1, 0); 
    glMultiTexCoord2f(GL_TEXTURE0, 0.0, fF); 
    glMultiTexCoord2f(GL_TEXTURE1, 0.0, spot_y); 
    glVertex3fv(d); 
    glMultiTexCoord2f(GL_TEXTURE0, fF, fF); 
    glMultiTexCoord2f(GL_TEXTURE1, spot_x, spot_y); 
    glVertex3fv(c); 
    glMultiTexCoord2f(GL_TEXTURE0, fF, 0.0); 
    glMultiTexCoord2f(GL_TEXTURE1, spot_x, 0.0); 
    glVertex3fv(e); 
    glMultiTexCoord2f(GL_TEXTURE0, 0.0, 0.0); 
    glMultiTexCoord2f(GL_TEXTURE1, 0.0, 0.0); 
    glVertex3fv(g); 

    glEnd(); 

我試圖把六行代碼**的內部,幾個地點,思考也許OpenGL狀態機需要它在某個特定的地方,但似乎沒有給我我想要的效果。

以前有人做過這個嗎?我無法在我的OpenGL書籍中找到任何信息,也無法在網上找到有關翻譯和混合紋理的信息。我可能正在尋找錯誤的東西,但我現在已經在牆上打了我兩天的頭。任何幫助都會很棒。

由於

+4

你是glTranslating()在x和y方向上的5單位...但紋理座標是在[0,1]間隔 - 這可能是問題嗎? – 2010-09-16 00:55:44

+0

聖克拉波拉你是對的!這樣可行!非常感謝。這是有道理的,翻譯5將把它放回到它開始的同一個地方。回答我的問題,以便我可以將其標記爲正確答案 – jakev 2010-09-16 01:14:49

回答

3

爲了完整起見,問題是,紋理在區間[0,1]的座標秋天,我被整數值轉換,因此它看來好像它未翻譯的。