2012-07-04 173 views
1

我在兩個實際上具有相同位置和位置的表面上渲染紋理。OpenGL正確顯示紋理

在這幾樣我想只顯示紋理的一個,案例,而我獲得以下

enter image description here

即我只想要顯示第一種材質的紋理。

所以我想知道我在哪裏尋找解決方案,我應該玩混合的材料?

回答

4

這是一個很老的問題(z-fighting),因爲卡片不確定在前面繪製哪個對象。鏈接的維基百科文章有更多的例子。

若要解決此問題,請增加深度緩衝區的精度(位深度),減小視圖的深度(遠離/接近剪切平面的距離)或添加微小偏移量,以便座標不再精確(或幾乎)相同。你可以簡單地禁用深度緩衝區(或清除它)來渲染它(在這種情況下,最後呈現的任何東西都會覆蓋其他所有內容)。

+0

也許使用glPolygonOffset()來抵消其中一個多邊形? –

+0

移動頂點的任何東西都可以工作,但是所需的距離可能會因您的硬件和驅動程序而有所不同。只要保持Depth Buffer處於活動狀態,就沒有100%的安全方法。 – Mario

1

你的意思是你想同時顯示一些紋理?然後使用多紋理。使用附加的紋理都向一個四:

glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 0.0f, 0.0f); 
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0f, 0.0f); 

而且隨着glTexEnvi發揮你希望將它們組合。如果只想顯示其中一個紋理,則在每個紋理上繪製兩個具有單獨紋理的四邊形。而後來將繪製的四人女巫將可見。然後,如果您想從一個轉到另一個,請爲每個四元組分別製作-(void),在每個四元素繪圖之前使用glClearColor,然後使按鈕調用例如-(void)quad1和按鈕撥打-(void)quad2

或者只是使用深度緩衝區。

在你的情況下,我會使用多紋理,因爲所有的緩衝區看起來對我來說太辛苦了。


我將展示我的代碼如何。使用多紋理

代碼:

glClear(GL_COLOR_BUFFER_BIT); 

//Turn on blending and set glBlendFunc for your needs 
glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

//Describing multitexturing 
glClientActiveTexture(GL_TEXTURE0_ARB); //Activating texture on unit 0 
glActiveTexture(GL_TEXTURE0_ARB); //Activating texture on unit 0 
glBindTexture(GL_TEXTURE_2D, Texture1); //Bind texture on unit 0 
glEnable(GL_TEXTURE_2D); //Enable GL_TEXTURE_2D to set it's glTexEnvi for your needs 
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); //Edit glTexEnvi for your needs (link bellow code) 
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_INTERPOLATE); 

glClientActiveTexture(GL_TEXTURE1_ARB); //Activating texture on unit 1 
glActiveTexture(GL_TEXTURE1_ARB); //Activating texture on unit 1 
glBindTexture(GL_TEXTURE_2D, Texture2); //Bind texture on unit 0 
glEnable(GL_TEXTURE_2D); //Enable GL_TEXTURE_2D to set it's glTexEnvi for your needs 
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); //Edit glTexEnvi for your needs (link bellow code) 
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE); 

//Drawing quad with multi texture 
glBegin(GL_QUADS); 
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 0.0f, 0.0f); //Texture on unit 0 coords 
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0f, 0.0f); //Texture on unit 1 coords 
glVertex2f(0.0, 500); 
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 0.0f, 1.0f); //Texture on unit 0 coords 
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0f, 1.0f); //Texture on unit 1 coords 
glVertex2f(0.0, 0.0); 
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 1.0f, 1.0f); //Texture on unit 0 coords 
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 1.0f, 1.0f); //Texture on unit 1 coords 
glVertex2f(800, 0.0); 
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 1.0f, 0.0f); //Texture on unit 0 coords 
glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 1.0f, 0.0f); //Texture on unit 1 coords 
glVertex2f(800, 500); 
glEnd(); 

//Disable GL_TEXTURE_2D. We don't need it anymore 
glDisable(GL_TEXTURE_2D); 
//Disable blending 
glDisable(GL_BLEND); 
//Flush everything 
glFlush(); 

代碼使用一個四對每個紋理

-(void) drawQuad1 
{ 
glClear(GL_COLOR_BUFFER_BIT); 
glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, Texture1); 
glBegin(GL_QUADS); 
    glTexCoord2f(0.0f, 0.0f); glVertex2f(0.0, 500); 
    glTexCoord2f(0.0f, 1.0f); glVertex2f(0.0, 0.0); 
    glTexCoord2f(1.0f, 1.0f); glVertex2f(800, 0.0); 
    glTexCoord2f(1.0f, 0.0f); glVertex2f(800, 500); 
glEnd(); 
glDisable(GL_TEXTURE_2D) 
glFlush(); 
} 

-(void) drawQuad2 
{ 
glClear(GL_COLOR_BUFFER_BIT); 
glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, Texture2); 
glBegin(GL_QUADS); 
    glTexCoord2f(0.0f, 0.0f); glVertex2f(0.0, 500); 
    glTexCoord2f(0.0f, 1.0f); glVertex2f(0.0, 0.0); 
    glTexCoord2f(1.0f, 1.0f); glVertex2f(800, 0.0); 
    glTexCoord2f(1.0f, 0.0f); glVertex2f(800, 500); 
glEnd(); 
glDisable(GL_TEXTURE_2D) 
glFlush(); 
} 

//and now when you want to draw `drawQuad1` you need to do `[self drawQuad1];` 
//and where you want to draw `drawQuad2` you need to do `[self drawQuad2];` 

信息關於glTexEnvi here。它只是示例代碼。快速寫入可能會有錯誤。對不起,如果我忘記了什麼只是我很久沒有這樣做了。寫在Mac OS X上,所以如果你使用其他平臺maby你將不得不改變一些東西(不是opengl)。而關於深度緩衝區?我不知道如何使用它。所以我無法爲你解釋。抱歉。從未使用過它們。

+0

Downvoting試圖幫助。多數民衆贊成在:) – hockeyman

+0

艱難的人羣在這裏。 ;)也許你可以編輯你的答案?諸如「爲每個四元組分開 - (無效)」等語句是模糊的。「或者只是使用深度緩衝區」也沒有幫助 - OP已經在使用它。 –

+0

已編輯帖子。添加示例代碼:) – hockeyman