[英]Is it possible to map a texture to quads similar to OpenGL with just Graphics?
[英]Texture repeating on quads OpenGL
我正在寫一個體素引擎,目前我正在研究Chunk-Rendering-System,但我有一個問題。 似乎在四邊形上重復了紋理。
草塊底部有綠線,我不知道為什么。
這是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_S
和GL_TEXTURE_WRAP_T
設置為GL_CLAMP_TO_EDGE
。
genpfault的答案應該為你做的伎倆,我只是想讓你深入了解為什么你需要這個特定的包裹狀態。
要清楚,屏幕截圖中的綠線對應於您的一個體素的邊緣?
看起來您正在使用GL_LINEAR
過濾(默認)以及不適當的紋理包裝狀態(例如GL_REPEAT
或GL_CLAMP
)。 我將在后面解釋為什么GL_CLAMP
是一個壞主意。
你可能認為紋理坐標0.0和1.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提出了一個好點; 通過圖表可以更容易理解...
http://i.msdn.microsoft.com/dynimg/IC83860.gif
在我寫給類似問題的答案中,我對這個圖有了更全面的解釋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.