繁体   English   中英

Pointcloud渲染,交错VBO

[英]Pointcloud rendering, interleaved VBO

我正在尝试渲染具有7个组件的vbo(互穿对吗?)。 前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标量)。

这基本上看起来还可以。 但是,您永远不会启用第二个顶点属性。 您将在安装代码中的某处需要它:

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);

如果您在所有代码中都使用VAO,则实际上不需要glBindVertexArray(0)调用,因为每个人在绘制之前都会绑定必要的VAO。 有些人喜欢显式取消绑定,以防代码的其他部分想要在不使用VAO的情况下进行渲染。 但这是浪费。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM