Qt OpenGL DrawElements not Drawing the second triangle
Qt OpenGL DrawElements not Drawing the second triangle
现在我正在按照Jamie King Qt OpenGL教程学习OpenGL。(他们很好(。
在其中一个教程中,我正在遵循它,但无法使用 DrawElemets 绘制两个顶点缓冲区三角形。 它适用于GLDrawArrays
请帮忙
提前谢谢。
GLWidget.h
#ifndef _GL_WIDGET_H_
#define _GL_WIDGET_H_
#include <QtOpenGLQGLWidget>
class GLWidget : public QGLWidget
{
public:
GLWidget();
virtual ~GLWidget();
protected:
void initializeGL();
void paintGL();
};
#endif
GLWidget.cpp
#include <glglew.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参考是这样说的:
指定连续泛型顶点之间的字节偏移量 属性。如果步幅为 0,则通用顶点属性为 被理解为紧紧地挤在阵列中。初始值为 0。
相关文章:
- 这对"With a stackless coroutine, only the top-level routine may be suspended."意味着什么
- Doees the 'this' 指针参与虚函数的多态行为
- 为什么当我为 for(auto& it : myUnorderedMap) {... = std::move(it.second)} 时,我会得到一个 const 引用?
- 为什么我会收到"Run-Time Check Failure #2 - Stack around the variable 'pr' was corrupted"错误?
- 您将如何连接"on the fly"文本+整数并将其传递给函数?
- 如何理解"Temporary objs are destroyed as the last step in evaluating the full-expression"?谁能用一些简单的例子来说明这
- 如何解决C++中声纳库贝静态代码分析错误"Explicitly define the missing copy constructor, move constructor .."
- Configuring the MPEG4MediaSink
- 这在C++ "It does not own the underlying data, and so is cheap to copy or assign"中意味着什么
- What is the std::chrono::time_point equivalent of std::numer
- 如何在数据库程序中添加"reduce the quantity of an item"功能?
- 使用自定义 nodejs 插件时的"The specified module could not be found"
- Boost.Python 和导入 dll,"The specified module could not be found"
- "Build succeeded"但"The breakpoint will not currently be hit"
- 尝试应用肖恩父母谈话"inheritance is the base class of evil"中的模式
- 为什么'allocate in one library and free in the other'是错误的
- 如何修复此错误"the value of 'x1' is not usable in a constant expression"?static_assert
- Count the digits
- 加载安全区图像"A device attached to the system is not functioning"
- Qt OpenGL DrawElements not Drawing the second triangle