2017-02-12 93 views
0

我想在OpenGL中渲染模型。我在C++和OpenGL的第4天(是的,我已經很快學會了這一點),並且我在紋理方面略有停頓。如何讓我的對象透明但仍然顯示紋理?

我在製作紋理alpha工作時遇到了一些麻煩。在這張圖片中,我有來自螺旋騎士的這個角色。正如你可以在頭頂看到的那樣,有那些白色的部分。 Spiral Knights character with no transparency

我有混合方法啓用,什麼我假設我在這裏的混合功能設置爲glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

,這就是爲什麼我問這個問題,是質地透明工作,但紋理背後的三角形仍在顯示。

如何讓這些三角形看不見但仍能顯示我的紋理?

謝謝。

+1

Threre沒有「紋理背後的三角形」。 GL不繪製紋理,它繪製原始圖形。完全不清楚究竟發生了什麼(你的紋理有哪些akoha值,你如何將紋理結合到最終的片段顏色等等)。 YOu也應該知道,混合將需要以正確的順序繪製原語。在這種特殊情況下,你甚至可以通過不使用混合來解決這個問題,而只是通過基於alpha的丟棄來解決這個問題。 – derhass

+0

你說_「只是通過基於alpha的丟棄。」_ - 我做了一些關於丟棄的研究,但是從我讀過的內容可能會有點緩慢。有沒有其他方法?我做了一些搜索替代方法並啓用alpha測試,然後將alpha函數設置爲'glAlphaFunc(GL_GREATER,0.0);'但似乎沒有工作。 –

+0

alpha測試已棄用。現代的方法在着色器中被丟棄。在這種情況下「慢」的真正含義很難預先說明。你可能會後退到深度測試,並且你會得到一定程度的非均勻控制流。但是,您獲得訂單獨立性作爲回報。 – derhass

回答

0

有使用混合時要完成兩個重要的事情:

  1. 必須排序元后到前和渲染基於深度緩衝呈示順序(順序無關的透明度仍然是一個持續的研究課題)。

  2. 當使用紋理來控制alpha通道時,您必須寫一個着色器,以某種方式獲取紋理的alpha值傳遞給結果片段顏色,或者 - 如果您使用的是固定功能管道,則必須使用GL_MODULATE紋理env模式或GL_DECAL(原始顏色alpha值設置爲0),或使用GL_REPLACE。

+0

至於任務#2的第二部分,我知道'glTexEnvi'需要3個參數。在閱讀[本頁](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glTexEnv.xml)後,我繼續嘗試根據該頁面的信息做你說的話。我將我的內部格式設置爲GL_RGBA(在'glTexImage2D'函數中),我使用'glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE);',但這似乎不起作用。我錯過了什麼嗎? –

+0

@XantheDragon:很難說沒有看到你的代碼。 – datenwolf