簡體   English   中英

在OpenGL中,我可以訪問在頂點着色器中繪制的緩沖區嗎?

[英]In OpenGL can I access the buffer I'm drawing in a vertex shader?

我知道,每次運行頂點着色器時,它基本上都會訪問要繪制的緩沖區(VBO)的一部分,例如,繪制頂點編號7時,它基本上是基於頂點屬性等將7個頂點索引到該VBO中。

layout (location = 0) in vec3 position;
layout (location = 1) in vec3 normal;
layout (location = 2) in vec3 texCoords;     // This may be running on the 7th vertex for example.

我想做的是例如訪問VBO的較早部分,因此,當繪制第7個頂點時,我想例如訪問1號頂點,以便可以對其進行插值。

看到運行着色器時它已經已經索引到VBO中,我認為這是可能的,但我不知道該怎么做。

謝謝。

如您在文檔中所見,頂點屬性在每次着色器運行時都會改變。 因此,不能,您無法訪問在頂點着色器中為其他頂點定義的屬性。

您可能可以這樣做:定義一個統一數組並傳入所需的值。 但是請記住,您正在以這種方式使用更多的內存,您需要傳遞更多的數據等。

就像@Reaper所說的,您可以使用統一的緩沖區,該緩沖區可以自由訪問。 但是GPU不喜歡隨機訪問,它通常更有效地傳輸數據。

您也可以通過將稍后/之前頂點的數據添加到數組中來解決此問題,因為在C ++中,所有頂點都可以使用。

例如,如果這是“普通”數組:

{
    vertex1_x, vertex1_y, vertex1_z, normal1_x, normal1_y, normal1_z, texCoord1_x, texCoord1_y,
    ...
}

然后,您可以使用其他頂點的數據對其進行擴展以進行插值:

{
    vertex1_x, vertex1_y, vertex1_z, normal1_x, normal1_y, normal1_z, texCoord1_x, texCoord1_y, vertex2_x, vertex2_y, vertex2_z, normal2_x, normal2_y, normal2_z, texCoord2_x, texCoord2_y,
    ...
}

實際上,您可以在每個頂點傳遞任何數據。 只要確保在glVertexAttribPointer參數中調整了步幅大小和其他參數即可。

暫無
暫無

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

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