簡體   English   中英

紋理重復四邊形OpenGL

[英]Texture repeating on quads OpenGL

我正在寫一個體素引擎,目前我正在研究Chunk-Rendering-System,但我有一個問題。 似乎在四邊形上重復了紋理。

http://i.stack.imgur.com/6iuuN.png

草塊底部有綠線,我不知道為什么。

這是OpenGL-Render-Code:

Texture texture = TextureManager.getTexture(block.getTextureNameForSide(Direction.UP));
texture.bind();
GL11.glBegin(GL11.GL_QUADS);
GL11.glTexCoord2d(0, 0); GL11.glVertex3f(0, 1, 0);
GL11.glTexCoord2d(1, 0); GL11.glVertex3f(0, 1, 1);
GL11.glTexCoord2d(1, 1); GL11.glVertex3f(1, 1, 1);
GL11.glTexCoord2d(0, 1); GL11.glVertex3f(1, 1, 0);
GL11.glEnd();

這是OpenGL設置:

GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glShadeModel(GL11.GL_SMOOTH);
GL11.glClearColor(0.1F, 0.4F, 0.6F, 0F);
GL11.glClearDepth(1F);
GL11.glEnable(GL11.GL_DEPTH_TEST);
GL11.glDepthFunc(GL11.GL_LEQUAL);
GL11.glHint(GL11.GL_PERSPECTIVE_CORRECTION_HINT, GL11.GL_NICEST);
GL11.glCullFace(GL11.GL_BACK);
GL11.glEnable(GL11.GL_CULL_FACE);

確保GL_TEXTURE_WRAP_SGL_TEXTURE_WRAP_T設置為GL_CLAMP_TO_EDGE

genpfault的答案應該為你做的伎倆,我只是想讓你深入了解為什么你需要這個特定的包裹狀態。

要清楚,屏幕截圖中的綠線對應於您的一個體素的邊緣?

看起來您正在使用GL_LINEAR過濾(默認)以及不適當的紋理包裝狀態(例如GL_REPEATGL_CLAMP )。 我將在后面解釋為什么GL_CLAMP是一個壞主意。


你可能認為紋理坐標0.01.0完全在標准化的紋理坐標范圍內,因此不會被包裹,但你會錯的。

這種特殊的狀態組合將在[0,1]紋理坐標范圍的任一極端處從紋理的另一側拾取紋素。 紋理坐標1.0實際上稍微超出了紋理中最后一個紋素的中心 ,因此當GL獲取4個最接近的紋素以進行線性過濾時,它會圍繞紋理的另一側包裹至少2個紋素。

GL_CLAMP_TO_EDGE修改了這種行為,它將紋理坐標限制在實際上比[0,1]更具限制性的范圍內,這樣任何坐標都不會超出紋理中任何邊紋理像素的中心 線性過濾不會使用此集從紋理的另一側拾取紋素。 你也可以(大部分)通過使用GL_NEAREST過濾來解決這個問題,但這會導致很多紋理混疊。


您也可以使用GL_CLAMP ,順便說一下,在OpenGL 3.1中刪除了GL_CLAMP 在GL的舊版本中,它被設計為將坐標鉗位到范圍[0,1]中,然后如果線性過濾試圖獲取超出邊緣的紋理元素,則它將使用一組特殊的邊框紋理而不是環繞。 不再支持邊框紋理,因此包裝模式消失了。

底線是不使用GL_CLAMP ,它沒有做大多數人的想法。 當你想到夾緊紋理時, GL_CLAMP_TO_EDGE幾乎總是你真正想要的。


編輯:

genpfault提出了一個好點; 通過圖表可以更容易理解...

下圖說明了1維問題:

http://i.msdn.microsoft.com/dynimg/IC83860.gif

在我寫給類似問題的答案中,我對這個圖有了更全面的解釋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM