2014-08-30 89 views
0

我想渲染一個有7個組件的vbo(interlaving right?)。 前4個是x,y,z,w(w是比例因子),其餘3個將用於片段着色器中的亮度調整 。點雲渲染,交錯VBO

這是我如何創建VBO:

std::vector<float> pointCloudData; 
while(endOfFile != true){ 

    ... // a lot of textfile handling/reading before, total of 100361 coordinates read. 

    for (int i = 0; i < 4; i++){ 
     pointCloudData.push_back(xyzFromFile[i]); //store the read x y z w coordinate 
    } 
    // store extra data 
    // right now im setting everything to 1.f just to see results in fragment shader! 
    pointCloudData.push_back(1.f); 
    pointCloudData.push_back(1.f); 
    pointCloudData.push_back(1.f); 
} 

v_size = pointCloudData.size(); 

// create vbo 
glGenVertexArrays(1, &_vaoID); 
    glGenBuffers(1, &_vboID); 
    glBindVertexArray(_vaoID); 
    glBindBuffer(GL_ARRAY_BUFFER, _vboID); 
    glBufferData(GL_ARRAY_BUFFER, v_size*sizeof(GLfloat), &pointCloudData[0], GL_DYNAMIC_DRAW); 
glBindVertexArray(0); 

在繪製方法:

glBindVertexArray(_vaoID); 
    glBindBuffer(GL_ARRAY_BUFFER, _vboID); 
    glEnableVertexAttribArray(positionAttrib); 

    GLsizei stride = sizeof(GLfloat) * 7; 
    glVertexAttribPointer(positionAttrib, 4, GL_FLOAT, GL_FALSE, stride, (void*)0); // x y z 
    glVertexAttribPointer(brightnessDataAttrib, 3, GL_FLOAT, GL_FALSE, stride, (void*)(4 * sizeof(GLfloat))); // remaining data 

    glDrawArrays(GL_POINTS, 0, vertsToDraw); 
    glDisableVertexAttribArray(positionAttrib); 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 
    glBindVertexArray(0); 

頂點着色器:

layout(location = 0) in vec4 in_position; 
layout(location = 2) in vec3 in_brightness; 

out vec3 vs_brightness; 
void main() 
{ 
    vs_brightness = in_brightness; 
    gl_Position = ViewProjection * vs_position; 
} 

片段着色器:

in vec3 vs_brightness; 
void main(void) 
{ 
    diffuse = vec4(vs_brightness[1],0,0,1); // at this point i just want SOMETHING to show up 
} 

如果這是個不錯的方法,我怎麼能做到這一點不同?我怎樣才能將其餘3個標量發送給片段着色器? (其總共3 * 100361個標量)。

+0

我不清楚你的問題是什麼。發佈的代碼是否正常工作,並且您在尋找反饋?或者你有問題嗎?如果是,具體問題是什麼? – 2014-08-30 02:48:08

+0

我的具體問題是vs_brightness(見frag)傳遞給它的值爲零。所以基本上我的管道中發生了一些非常不幸的事情。這是什麼,我不知道,我懷疑它可能是'stride'參數...但真的很無能... – mike 2014-08-30 15:56:07

回答

1

這大多看起來不錯。不過,你永遠不會啓用第二個頂點屬性。你需要在你的設置代碼這個地方:

glEnableVertexAttribArray(brightnessDataAttrib); 

這假定positionAttrib是0和brightnessDataAttrib爲2,匹配的頂點着色器的位置。

雖然不是一個正確的問題,但你沒有充分利用VAO。在設置過程中,您可以創建並綁定VAO,但不要設置任何在VAO中跟蹤的狀態。相反,你在抽獎中擁有所有這些。這打破了使用VAO的目的。這個想法是,它保留了所有的頂點設置狀態,然後你可以通過再次綁定VAO來獲得繪製所需的所有狀態。

所以在設置代碼,更好的結構是這樣的:

glBindBuffer(GL_ARRAY_BUFFER, vboID); 
glBufferData(GL_ARRAY_BUFFER, ...); 

glBindVertexArray(vaoID); 
glEnableVertexAttribArray(...); 
glVertexAttribPointer(...); 
glBindVertexArray(0); 

glBindBuffer(GL_ARRAY_BUFFER, 0); 

然後在繪製代碼,你只需要這樣:

glBindVertexArray(0)電話是不是真的有必要如果你在所有的代碼中使用VAO,因爲在繪製之前,每個人都將綁定必要的VAO。有些人喜歡有明確的解除綁定,以防代碼的其他部分想要在沒有VAO的情況下渲染。但這是一種浪費。

+0

謝謝你的回覆Reto。當你說'設置代碼'時,你是指我如何創建我的vbo?因此,在baisically我做一切在初始化,然後在Render()方法下,我只需要做這三行?我試試這個。 – mike 2014-08-30 15:54:48

+0

是的,確切地說。我懷疑你的主要問題是我的答案開始時的部分,但缺少'glEnableVertexAttribArray()'。 – 2014-08-30 16:06:06

+0

這使它工作!過去幾天我一直在拉我的頭髮,想想那些小東西......魔鬼在於細節。我會做你現在建議的優化。太感謝了! – mike 2014-08-30 23:46:11