现在,我正在按照Jamie King Qt OpenGL教程学习OpenGL。(他们很好)。
在其中一本教程中,我遵循它,但是无法使用DrawElemets绘制两个顶点缓冲区三角形。它与GLDrawArrays一起使用
请帮忙
提前致谢。
GLWidget.h
#ifndef _GL_WIDGET_H_
#define _GL_WIDGET_H_
#include <QtOpenGL\QGLWidget>
class GLWidget : public QGLWidget
{
public:
GLWidget();
virtual ~GLWidget();
protected:
void initializeGL();
void paintGL();
};
#endif
GLWidget.cpp
#include <gl\glew.h>
#include "globals.h"
#include "GLWidget.h"
using namespace std;
#define SIZE 1.0f
GLWidget::GLWidget()
{
}
GLWidget::~GLWidget()
{
}
// GLWindow Initialize function.
void GLWidget::initializeGL()
{
// Initializing GLEW.
GLenum err = glewInit();
// Checking if the glew loads fine.
if(err != GLEW_OK)
{
cerr<<"Cannot initialize GLEW: "<<err<<endl;
}
// Vertex Buffer storage space.
GLuint vertBufferID;
GLuint vertIndicesID;
// Vertex array.
GLfloat verts[] =
{
// First traingle.
+0.0f, +0.0f, // 0
+1.0f, +1.0f, // 1
-1.0, +1.0, // 2
-1.0, -1.0, // 3
+1.0, -1.0, // 4
};
// Creating the vertex buffer
glGenBuffers(1, &vertBufferID);
// binding the buffer.
glBindBuffer(GL_ARRAY_BUFFER, vertBufferID);
glBufferData(GL_ARRAY_BUFFER, sizeof(verts), &verts, GL_STATIC_DRAW);
// Enalbing the position attribute of the vertex.
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
// Creating the vertex indices buffer.
GLushort indices[] = { 0, 1, 2, 0, 3, 4};
glGenBuffers(1, &vertIndicesID);
// binding the buffer.
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vertIndicesID);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(vertIndicesID), indices, GL_STATIC_DRAW);
}
// GLWindow Paint Function.
void GLWidget::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Defining the viewport.
glViewport(0, 0, width(), height());
// Drawing the Triangle.
//glDrawArrays(GL_TRIANGLES, 0, 6);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0);
}
当您上载索引缓冲区时:
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(vertIndicesID), indices, GL_STATIC_DRAW);
您正在使用错误的变量的大小。应该是:
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
不知道是否知道这一点,您未指定步幅:
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
应该
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), 0);
跨度是顶点缓冲区中两个顶点分开的字节数。如果您告诉它们相距0,则基本上将始终渲染相同的顶点。(完全不确定如何绘制第一个三角形)。
更新:事实证明,0是跨步的有效参数。OpenGL参考说明了这一点:
指定连续的通用顶点属性之间的字节偏移。如果stride为0,则将通用顶点属性理解为紧密包装在数组中。初始值为0。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句