c++ - 为什么我的 openGL 顶点缓冲对象不绘制任何东西?

标签 c++ opengl

我正在尝试使用 glDrawElements/Arrays 函数在 openGL 4 中渲染模型。我目前正在读取包含顶点数据和多边形索引的文件。除了我用作引用的轴外,我无法在屏幕上显示任何内容。我已经多次成功地使用了这种通用方法。我不知道我可能做错了什么并且被困了将近一天。

这是我缓冲数据的地方

// get position of "in vec4 vPosition;" from shader program
// displays axes properly
vPosition = glGetAttribLocation( program, "vPosition" );

// create buffers
glGenVertexArrays(2, vao);
glGenBuffers( 3, vbo );

// here I bind vao[0] and vbo[0] then buffer
// a set of XYZ axes which display correctly

// buffer model
glBindVertexArray( vao[1] );
glBindBuffer( GL_ARRAY_BUFFER, vbo[1] );
glBufferData( GL_ARRAY_BUFFER, sizeof(board->verts),
                board->verts, GL_STATIC_DRAW );

glEnableVertexAttribArray( vPosition );
glVertexAttribPointer( vPosition, 4, GL_FLOAT, GL_FALSE, 0,
                        BUFFER_OFFSET(0));

glBindBuffer( GL_ELEMENT_ARRAY_BUFFER , vbo[2] );
glBufferData(
        GL_ELEMENT_ARRAY_BUFFER,
        sizeof(board->indices),
        board->indices.data(),
        GL_STATIC_DRAW);

fyi board 是一个冲浪板模型,其中读取了 glDrawElements 的顶点和索引。如果在调用 glBufferData 的上方包含以下代码,则可以正确打印这些顶点和索引

for( int i = 0; i < board->numVerts; i++ ){
    std::cerr << i << ":  "<<board->verts[i].x << " "<<board->verts[i].y<<" "<<
            board->verts[i].z << " " << board->verts[i].w << std::endl;
}

如果放入类似的打印循环,索引也一样。这是我尝试绘制模型的地方:

void draw_model(){

    glUniform4fv( color_loc, 1, glm::value_ptr(blue));
    glBindVertexArray( vao[1] );

    glDrawArrays( GL_LINE_STRIP, 0, 600 );

    //glDrawElements(
    //  GL_LINES,
    //  board->indices.size(),
    //  GL_UNSIGNED_INT,
    //  NULL
    //);

}

调用 DrawElements(注释掉)不显示任何内容。对 DrawArrays 的调用是一项故障排除工作,目的是查看我是否只是错误地使用了 DrawElements(我过去只使用过 drawArrays)。 board 定义为 model3d *board。这是它的类

class model3d{
public:
    glm::vec4 *verts;
    std::vector<int> indices;
    int numVerts;
    int numPolys;
    model3d( const char*, const char* );
private:
    void load_coords( const char* );
    void load_polys( const char* );
};

为什么我的数据似乎没有缓冲?

最佳答案

不要使用 sizeof(board->verts) 因为它只会返回指针的大小。

关于c++ - 为什么我的 openGL 顶点缓冲对象不绘制任何东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13282363/

相关文章:

c++ - 掷硬币直到出现 3 个正面

java - gl_Normal 计算不正确

java - 如何绘制一组水平线?

c++ - gluLookAt() 在 OpenGL 中无效

c++ - 英伟达 NSight "process creation failure"

c++ - 替代 itoa() 将整数转换为字符串 C++?

c++ - 句子中的字母出现 C++

C++ Boost 最大偏差

c++ - 如果 uint8_t 值乘以 uint8_t 是什么类型

Java NASA Worldwind 具有内部边框的多边形