2012-12-07 68 views
1

gl_PointCoord返回代表該像素處的UV映射座標的2D向量。但它似乎只在片段着色器中可用。我知道您可以使用varying將頂點着色器中的值發送到片段着色器,但是您能否以其他方式發送它?我可以獲取當前頂點的UV座標嗎?我可以在頂點着色器中訪問gl_PointCoord嗎?

是否有可能在頂點着色器中訪問gl_PointCoord

回答

1

「在該像素處的UV貼圖座標」 - 確實,但在頂點着色器中沒有任何像素。你錯過了點精靈實際上是如何工作的。單個頂點着色器調用輸出大於1像素的gl_PointSize會導致對該點進行多個片段着色器調用(因爲該點很好地覆蓋了多個像素)。這些碎片根據它們在這個較大點精靈中的位置得到他們的gl_PointCoord。但是覆蓋多個碎片的每個點精靈總是由單個頂點產生。所以從概念上講,這個單頂點gl_PointCoord對於每個頂點只是(0.5, 0.5),但最終甚至沒有任何意義,因爲實際上沒有任何像素的概念,更不用說頂點着色器內的每像素UV座標了。

「但你可以用另一種方式發送它」 - 我確定這是非常非正式的意思,因爲當然你不能將任何數據從片段着色器發送到頂點着色器,因爲只有圖形管道以單一方向工作。

編輯:關於你的評論,如果不使用點精靈,gl_PointCoord變量根本沒有任何意義。你不能將它用作一般的UV座標(片段着色器應該如何得出合理的值)。爲此,您必須從頂點着色器中提取一個有效的紋理座標(作爲varying),然後將其插入片段着色器中要訪問的片段中,最終可能會作爲額外的attribute傳遞到頂點着色器中通常。

+0

我沒有製作點精靈。我有一些細長的條紋,我想根據UV座標來移動頂點,因爲它是一個非常方便的標準化浮線,告訴我沿着我的條紋有多遠。或者'gl_PointCoord'只適用於點精靈,而不是一般的網格? –

+0

@AlexWayne確實,更新了我的答案。 –

+0

我現在意識到我的思維過程的錯誤在這裏。我現在明顯不能從frag到vert shader「發送」任何東西,現在我更多地考慮它。儘管我認爲'uv'只是我想要的標識符,它是從頂點着色器開始工作的,但在深入研究示例之後。感謝您的澄清解釋。 –

相關問題