我在兩個實際上具有相同位置和位置的表面上渲染紋理。OpenGL正確顯示紋理
在這幾樣我想只顯示紋理的一個,案例,而我獲得以下
即我只想要顯示第一種材質的紋理。
所以我想知道我在哪裏尋找解決方案,我應該玩混合的材料?
我在兩個實際上具有相同位置和位置的表面上渲染紋理。OpenGL正確顯示紋理
在這幾樣我想只顯示紋理的一個,案例,而我獲得以下
即我只想要顯示第一種材質的紋理。
所以我想知道我在哪裏尋找解決方案,我應該玩混合的材料?
這是一個很老的問題(z-fighting),因爲卡片不確定在前面繪製哪個對象。鏈接的維基百科文章有更多的例子。
若要解決此問題,請增加深度緩衝區的精度(位深度),減小視圖的深度(遠離/接近剪切平面的距離)或添加微小偏移量,以便座標不再精確(或幾乎)相同。你可以簡單地禁用深度緩衝區(或清除它)來渲染它(在這種情況下,最後呈現的任何東西都會覆蓋其他所有內容)。
你的意思是你想同時顯示一些紋理?然後使用多紋理。使用附加的紋理都向一個四:
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)。而關於深度緩衝區?我不知道如何使用它。所以我無法爲你解釋。抱歉。從未使用過它們。
也許使用glPolygonOffset()來抵消其中一個多邊形? –
移動頂點的任何東西都可以工作,但是所需的距離可能會因您的硬件和驅動程序而有所不同。只要保持Depth Buffer處於活動狀態,就沒有100%的安全方法。 – Mario