我想渲染一個有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個標量)。
我不清楚你的問題是什麼。發佈的代碼是否正常工作,並且您在尋找反饋?或者你有問題嗎?如果是,具體問題是什麼? – 2014-08-30 02:48:08
我的具體問題是vs_brightness(見frag)傳遞給它的值爲零。所以基本上我的管道中發生了一些非常不幸的事情。這是什麼,我不知道,我懷疑它可能是'stride'參數...但真的很無能... – mike 2014-08-30 15:56:07