尝试在 C++ 中使用 glDrawArrays 时出错
Posted
技术标签:
【中文标题】尝试在 C++ 中使用 glDrawArrays 时出错【英文标题】:Error when trying to use glDrawArrays in C++ 【发布时间】:2016-11-02 07:54:50 【问题描述】:我试图在我的游戏中绘制一个简单的矩形,但我一直遇到以下中断:
这是我的 Sprite.cpp 中的代码,我在其中绑定和渲染内容。
void Sprite::init(float x, float y, float width, float height)
this->x = x;
this->y = y;
this->width = width;
this->height = height;
if(vbo == 0)
glGenBuffers(1, &vbo);
Vertex vertex[6];
vertex[0].setPosition(x, y);
vertex[0].setUV(0, 0);
vertex[1].setPosition(x, y + height);
vertex[1].setUV(0, 1);
vertex[2].setPosition(x + width, y + height);
vertex[2].setUV(1, 1);
vertex[3].setPosition(x, y);
vertex[3].setUV(0, 0);
vertex[4].setPosition(x + width, y);
vertex[4].setUV(1, 0);
vertex[5].setPosition(x + width, y + height);
vertex[5].setUV(1, 1);
for (int i = 0; i < 6; i++)
vertex[i].setColor(0.0, 0.0, 1.0, 1.0);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(vbo, sizeof(vertex), vertex, GL_DYNAMIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
void Sprite::render()
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, position));
glVertexAttribPointer(1, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(Vertex), (void*)offsetof(Vertex, color));
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, uv));
glDrawArrays(GL_TRIANGLES, 0, 6);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(2);
glBindBuffer(GL_ARRAY_BUFFER, 0);
如果我注释掉“glDrawArrays(GL_TRIANGLES, 0, 6)”行,那么程序将运行得非常好。这是我的 Vertex 结构,仅供参考:
#pragma once
#include <GL\glew.h>
struct Position
float x, y;
;
struct UV
float u, v;
;
struct Color
GLubyte r, g, b, a;
;
struct Vertex
Position position;
Color color;
UV uv;
void setUV(float u, float v)
uv.u = u;
uv.v = v;
void setColor(GLubyte r, GLubyte g, GLubyte b, GLubyte a)
color.r = r;
color.g = g;
color.b = b;
color.a = a;
void setPosition(float x, float y)
position.x = x;
position.y = y;
;
我真的不知道为什么会这样。我听说这个错误与取消引用一些空指针或其他东西有关。我只是不知道如何解决这个问题。非常感谢任何帮助。
【问题讨论】:
【参考方案1】:这个:glBufferData(vbo, sizeof(vertex), vertex, GL_DYNAMIC_DRAW);
应该是:glBufferData(GL_ARRAY_BUFFER, sizeof(vertex), vertex, GL_STATIC_DRAW);
因为第一个参数指定了数组的使用方式。
【讨论】:
我现在讨厌自己...非常感谢。我想既然我今天已经为此工作了这么长时间,它只需要一双新的眼睛。谢谢! Lol ikr,我们都犯过并且在某些时候仍然犯同样的错误!干杯。以上是关于尝试在 C++ 中使用 glDrawArrays 时出错的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 glDrawArrays 和 glVertexPointer?
glDrawArrays 仅在原点绘制一个点(在 ubuntu 上带有 glut 的 OpenGL)