簡體   English   中英

OpenglES 2.0 頂點着色器屬性

[英]OpenglES 2.0 Vertex Shader Attributes

我在教程中讀到頂點着色器需要的最低限度定義如下:

attribute vec3 v3_variable;
attribute vec3 v3Pos;

void main()
{
    gl_Position = v3Pos;
}

OpenglES 將着色器頂點數據傳遞給v3Pos但這個變量的名稱實際上可以是任何東西,其他教程將其命名為a_Positiona_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.

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