[英]OpenglES 2.0 Vertex Shader Attributes
我在教程中讀到頂點着色器需要的最低限度定義如下:
attribute vec3 v3_variable;
attribute vec3 v3Pos;
void main()
{
gl_Position = v3Pos;
}
OpenglES 將着色器頂點數據傳遞給v3Pos
但這個變量的名稱實際上可以是任何東西,其他教程將其命名為a_Position
, a_Pos
,隨便~。
所以我的問題是,當我調用glVertexAttribPointer()
時,OpenglES 如何知道它應該將該數據放入v3Pos
而不是v3_variable
?
好的,所以在應用程序方面,您將收到一個看起來像
glBindAttribLocation(MyShader, 0, "v3Pos");
(在鏈接着色器之前)或
vertexLoc = glGetAttribLocation(MyShader, "v3Pos");
鏈接程序后。
然后 glVertexAttribPointer 調用的第一個元素將是 0 或 vertexLoc。
glVertexAttribPointer(vertexLoc, 3, GL_FLOAT, GL_FALSE, sizeof(MyVertex), BUFFER_OFFSET(0));
簡而言之,gl 鏈接器要么將 v3Pos 分配給它自己在內存中的位置,要么脫離你告訴它的內容。 無論哪種方式,您都必須與着色器進行一些交互才能與屬性進行交互。
希望有幫助
有兩種方法可以識別着色器中的哪些屬性與您提供給glVertexAttribPointer
的數據“配對”。 使用glVertexAttribPointer
獲得的唯一標識符是index
(第一個參數),因此必須以某種方式通過索引完成。
在第一種方法中,在使用glGetAttribLocation編譯和鏈接后,您從着色器獲取屬性的索引,並將其用作第一個參數,例如。
GLint program = ...;
GLint v3PosAttributeIndex = glGetAttribLocation(program, "v3Pos");
GLint v3varAttributeIndex = glGetAttribLocation(program, "v3_variable");
glVertexAttribPointer(v3PosAttributeIndex, ...);
glVertexAttribPointer(v3varAttributeIndex, ...);
您還可以在創作着色器時顯式設置屬性的布局(如@jp 的評論所示),因此您可以像這樣修改着色器:
layout(location = 1) in vec3 v3_variable;
layout(location = 0) in vec3 v3Pos;
然后在代碼中,您將顯式設置它們:
glVertexAttribPointer(0, ...); // v3Pos data
glVertexAttribPointer(1, ...); // v3_variable data
第二種方法僅適用於 GLES 3.0+(和 OpenGL 3.0+),因此如果您僅使用 GLES 2.0,它可能不適用於您的情況。 另請注意,您可以同時使用這兩種方法。 例如。 即使您明確定義了布局,也不會限制您以后查詢它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.