作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个关于 QT 中 VAO 的问题。按理说here ,我写了下面一段代码用于初始化:
void GLWidget::initializeGL() {
vao.create();
vao.bind();
// setting up buffers
buffer.create();
buffer.setUsagePattern(QOpenGLBuffer::StaticDraw);
buffer.bind();
buffer.allocate(vertices.data(), 3 * vertices.size() * sizeof(float));
vao.release();
}
在绘画阶段,我简单的做了以下几件事:
void GLWidget::paintGL() {
// some other code
vao.bind();
if(shader_program->isLinked()) {
shader_program->setUniformValue("mvpMatrix", p_matrix * v_matrix * m_matrix);
// the interesting part about the buffer:
shader_program->setAttributeBuffer("vertex", GL_FLOAT, 0, 3);
shader_program->enableAttributeArray("vertex");
// the drawing
glDrawArrays(GL_TRIANGLES, 0, vertices.size());
shader_program->disableAttributeArray("vertex");
}
vao.release();
}
就我只处理一个 VAO 而言,这是可行的。但是,在使用多个 VAO 时,不会绘制任何内容或仅绘制一个“对象”(缓冲区)。每个对象的代码完全相同,所以绘图总是
所以问题是如何使用包含不同缓冲区的多个 vao。
最佳答案
您错误地抽象了 GLSL 程序类。
程序本身不存储顶点数组指针和数组启用/禁用状态,VAO 会。您需要将代码直接移动到注释下方:“关于缓冲区的有趣部分:”到 initializeGL (...)
中,但是由于您的 GLSL 程序类当前设置的方式,您将需要重构它和你的 VAO 类。
目前 none initializeGL (...)
中的命令实际上会影响您的 VAO 的状态 - 您正在绑定(bind)和解除绑定(bind)VAO 中间有一些不相关的命令(我将在下面解释)。
glDrawElements (...)
)。当您重新使用 VAO 类时,这可能会成为重要的知识。
当您使用 VAO 时,您也不应该在绘图前后启用和禁用数组,这是创建 VAO 的部分原因。您在绘制之前绑定(bind)一个 VAO,它负责启用它需要的所有数组并禁用它不需要的数组(这应该在您的 initializeGL (...)
函数中建立)。
关于c++ - QOpenGLVertexArrayObject 的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20634627/
我有一个关于 QT 中 VAO 的问题。按理说here ,我写了下面一段代码用于初始化: void GLWidget::initializeGL() { vao.create(); v
我是一名优秀的程序员,十分优秀!