2013-01-24 53 views
0

我想使用glVertexAttribPointer()給我的頂點着色器一些數據。問題是,它的第一屬性的工作只有...glVertexAttribPointer()只適用於第一個流

這裏是我的OpenGL代碼:

struct Flag_vertex 
{ 
    GLfloat position_1[ 8 ]; 
    GLfloat position_2[ 8 ]; 
}; 

Flag_vertex flag_vertex; 

    ... // fill some data to flag_vertex 

GLuint vertexbuffer_id; 
glGenBuffers(1, &vertexbuffer_id); 
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer_id); 
glBufferData(GL_ARRAY_BUFFER, sizeof(flag_vertex), &flag_vertex, GL_STATIC_DRAW); 

glEnableVertexAttribArray(0); 
glEnableVertexAttribArray(1); 

glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer_id); 
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (void*)offsetof(Flag_vertex, position_1)); 
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (void*)offsetof(Flag_vertex, position_2)); 

和我着色器是一樣的東西:

#version 420 core 

layout(location = 0) in vec2 in_position_1; 
layout(location = 1) in vec2 in_position_2; 

out vec2 texcoord; 

void main() 
{ 
    gl_Position = vec4(in_position_X, 0.0, 1.0); 
    texcoord = in_position_X * vec2(0.5) + vec2(0.5); 
} 

如果我使用「in_position_1 「我的紋理RENDERS PERFECTLY,但如果我使用in_position_2沒有任何反應...

提示:在鏈接我的着色器之前我在做:

glBindAttribLocation(programID, 0, "in_position_1"); 
glBindAttribLocation(programID, 1, "in_position_2"); 

爲什麼它只適用於第一個流?我需要更多的數據到我的頂點......我需要發送顏色等......任何提示?

+0

你是否啓用了兩個頂點屬性?順便說一句,如果在着色器中使用佈局限定符,則不需要使用'glBindAttribLocation'。 – radical7

+0

哦,是的,當然...我忘記寫了...我使用glEnableVertexAttribArray(0)和glEnableVertexAttribArray(1)之前...我會更新它。 –

+0

如果您切換佈局ID(即,in_position_1 - > 1,in_position_2 - > 0),做事情的工作方式不同嗎? – radical7

回答

0
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (void*)offsetof(Flag_vertex, position_1)); 
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (void*)offsetof(Flag_vertex, position_2)); 

這些行沒有意義。至少,不是如何定義Flag_vertex。如果Flag_vertex實際上應該是頂點(而不是四元組),那麼它就沒有意義,它有8個浮點數。如果每個Flag_vertex定義了完整的四元組,則您將其命名爲錯誤;它根本不是頂點,它是Flag_quad

因此很難知道你甚至試圖在這裏完成什麼。

另外:

如果我使用 「in_position_1」 我的質地RENDERS完美,但如果我用in_position_2沒有任何反應......

當然它中。您的位置數據屬於屬性0.因此,您的位置數據是屬性1中的而不是。如果您假裝屬性1具有您的位置數據,但顯然沒有,則您將無法獲得合理的結果。

你的問題是,當你應該使用他們兩個時,你總是使用屬性0。你不應該選擇一個或另一個。對於位置使用in_position_1,對於紋理座標使用in_position_2。並嘗試根據他們所做的事情合理地命名它們(如positiontexture_coord或其他)。不要爲他們使用數字。

提示:之前我的鏈接着色我做:

這是同樣的事情作爲着色器中的layout(location=#)設置。如果您想在着色器中使用它,請將其放入着色器中。如果你想在你的OpenGL代碼中使用它,那麼把它放在你的OpenGL代碼中。不要把它放在兩個地方。

+0

實際上,OP中的glVertexAttribPointer調用非常好,它們只是將兩個屬性數據流依次放在VBO中,這是在VBO中使用數據的一種非常常見的方式。問題的解決是在OP的代碼中的另一個地方,與OP沒有任何關係,請參見[chat](http://chat.stackoverflow.com/rooms/23319/discussion-between-radical7-and-wagner -patriota)以上爲解析度。 – radical7

+0

@ radical7:「*它們只是將兩個屬性數據流依次放在VBO *中」但「屬性數據」不是** a **「頂點」。這是我的觀點:如果它打算在一個結構中是兩個非交錯數組,那麼該結構被錯誤地命名。 –

+0

對不起,但我沒有理解你的觀點。如果您對海報選擇的變量名稱進行評論,則與解決方案無關。這篇文章中的代碼是正確和一致的(並且很好地格式化爲啓動:)事實上,OP中的所有代碼都是正確的 - 問題出在OP應用程序的其他地方。 – radical7

相關問題