首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >点云渲染,交错VBO

点云渲染,交错VBO
EN

Stack Overflow用户
提问于 2014-08-30 02:33:01
回答 1查看 1.1K关注 0票数 0

我正在尝试渲染一个vbo,其中有7个组件(插入对吗?)前4个是x,y,z,w (w是一个缩放因子),剩下的3个用于调整破片阴影的亮度。

,这就是我如何创建vbo:的方法

代码语言:javascript
复制
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);

渲染方法中的

代码语言:javascript
复制
    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);

顶点着色器:

代码语言:javascript
复制
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;
}

片段着色器:

代码语言:javascript
复制
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标量)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-30 03:51:29

这看起来基本上没问题。但是,您永远不会启用第二个顶点属性。在您的设置代码中需要这样的代码:

代码语言:javascript
复制
glEnableVertexAttribArray(brightnessDataAttrib);

这假设positionAttrib为0,brightnessDataAttrib为2,匹配顶点着色器中的位置。

虽然这并不是一个正确的问题,但你并没有很好地利用VAO。在安装过程中,创建并绑定一个VAO,但是不要设置任何在VAO中跟踪的状态。相反,你在抽签中拥有所有这些。这就违背了使用VAO的目的。其思想是,它保持所有顶点设置状态,然后您可以通过简单地绑定VAO再次获得绘制所需的所有状态。

因此,在设置代码中,更好的结构如下所示:

代码语言:javascript
复制
glBindBuffer(GL_ARRAY_BUFFER, vboID);
glBufferData(GL_ARRAY_BUFFER, ...);

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

glBindBuffer(GL_ARRAY_BUFFER, 0);

然后在抽签代码中,您只需要如下所示:

代码语言:javascript
复制
glBindVertexArray(vaoID);
glDrawArrays(...);
glBindVertexArray(0);

如果您在所有代码中都使用VAOs,那么glBindVertexArray(0)调用并不是真正必要的,因为每个人在绘制之前都会绑定所需的VAO。有些人喜欢显式解除绑定,以防代码的其他部分想要在没有VAO的情况下呈现。但否则就是浪费了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25578479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档