我正在尝试渲染一个vbo,其中有7个组件(插入对吗?)前4个是x,y,z,w (w是一个缩放因子),剩下的3个用于调整破片阴影的亮度。
,这就是我如何创建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 03:51:29
这看起来基本上没问题。但是,您永远不会启用第二个顶点属性。在您的设置代码中需要这样的代码:
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(vaoID);
glDrawArrays(...);
glBindVertexArray(0);如果您在所有代码中都使用VAOs,那么glBindVertexArray(0)调用并不是真正必要的,因为每个人在绘制之前都会绑定所需的VAO。有些人喜欢显式解除绑定,以防代码的其他部分想要在没有VAO的情况下呈现。但否则就是浪费了。
https://stackoverflow.com/questions/25578479
复制相似问题