如何在OpenGL中使用矢量和结构上传顶点数据
How to Upload Vertex Data Using Vectors and Structs in OpenGL?
我一直在尝试将顶点数据从矢量上传到VBO,以渲染有纹理的彩色正方形。当我运行该程序时,它在"glDrawArrays(…)"处中断,我在Tutorial.exe中的…nvoglv64.dll处得到一个"第一次机会异常:访问违规读取位置…"我不确定我做错了什么。虽然我的主要目标是在sprite批处理程序中使用它,但这里有一个简化的示例:
Game::Game()
{
Oreg::Core::init();
//INIT VAO
tex = Oreg::FileSys::getTex("Feels.png");
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glGenBuffers(1, &vbo);
glBindBuffer(GL_VERTEX_ARRAY, vbo);
GLuint posAtt = Oreg::DefShader::texture2D.getAtt("vert");
GLuint texAtt = Oreg::DefShader::texture2D.getAtt("texcoords");
GLuint colAtt = Oreg::DefShader::texture2D.getAtt("color");
glEnableVertexAttribArray(posAtt);
glEnableVertexAttribArray(texAtt);
glEnableVertexAttribArray(colAtt);
glVertexAttribPointer(posAtt, 2, GL_FLOAT, GL_FALSE, sizeof(Det::Vert), (GLvoid*)offsetof(Det::Vert, pos));
glVertexAttribPointer(texAtt, 2, GL_FLOAT, GL_FALSE, sizeof(Det::Vert), (GLvoid*)offsetof(Det::Vert, uv));
glVertexAttribPointer(colAtt, 4, GL_FLOAT, GL_FALSE, sizeof(Det::Vert), (GLvoid*)offsetof(Det::Vert, col));
glBindVertexArray(0);
std::cout<<"Size of GLfloat: "<<sizeof(GLfloat)<<"n"; //4
std::cout<<"Size of Vert: "<<sizeof(Det::Vert)<<"n"; //32
std::cout<<"Offset of Vert's pos: "<<offsetof(Det::Vert, pos)<<"n"; //0
std::cout<<"Offset of Vert's uv: "<<offsetof(Det::Vert, uv)<<"n"; //8
std::cout<<"Offset of Vert's col: "<<offsetof(Det::Vert, col)<<"n"; //16
//UPLOAD VERTS
std::vector<Det::Vert> verts;
verts.resize(6);
verts.at(0).setPos(0, 0);
verts.at(0).setUV(0, 0);
verts.at(0).setCol(1, 0, 1, 1);
verts.at(1).setPos(50, 0);
verts.at(1).setUV(1, 0);
verts.at(1).setCol(1, 0, 1, 1);
verts.at(2).setPos(50, 50);
verts.at(2).setUV(1, 1);
verts.at(2).setCol(1, 0, 1, 1);
verts.at(3).setPos(50, 50);
verts.at(3).setUV(1, 1);
verts.at(3).setCol(1, 0, 1, 1);
verts.at(4).setPos(0, 50);
verts.at(4).setUV(0, 1);
verts.at(4).setCol(1, 0, 1, 1);
verts.at(5).setPos(0, 0);
verts.at(5).setUV(0, 0);
verts.at(5).setCol(1, 0, 1, 1);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, verts.size()*sizeof(Det::Vert), verts.data(), GL_DYNAMIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
void Game::update()
{
//BEGIN RENDER
Oreg::Window::clear(0.0f, 0.06f, 0.09f, 1.0f);
Oreg::Window::renderSettings();
Oreg::DefShader::texture2D.use();
glm::mat4 mat = glm::ortho(0.0f, (float)Oreg::Window::getRes().x, (float)Oreg::Window::getRes().y, 0.0f, -1.0f, 1.0f);
glUniform1i(Oreg::DefShader::texture2D.getUni("tex"), 0);
glUniformMatrix4fv(Oreg::DefShader::texture2D.getUni("matrix"), 1, GL_FALSE, glm::value_ptr(mat));
glDisable(GL_DEPTH_TEST);
glDisable(GL_CULL_FACE);
//RENDER
glBindVertexArray(vao);
glBindTexture(GL_TEXTURE_2D, tex->id);
glDrawArrays(GL_TRIANGLES, 0, 6);
glBindVertexArray(0);
//END RENDER
glEnable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);
glUseProgram(0);
Oreg::Window::showBuffer();
}
Game::~Game(){ Oreg::Core::dest(); }
在接近开始的glBindBuffer()
调用中有一个错误的参数:
glGenBuffers(1, &vbo);
glBindBuffer(GL_VERTEX_ARRAY, vbo);
GL_VERTEX_ARRAY
作为第一个参数无效。应该是这样的:
glBindBuffer(GL_ARRAY_BUFFER, vbo);
如果OpenGL代码不能按预期工作,则应始终调用glGetError()
。在这种情况下,您将得到一个GL_INVALID_ENUM
错误。
没有直接的迹象表明你对此有问题,但需要注意的是:由于你在这个类的构造函数中进行OpenGL调用,你必须确保你只有在拥有当前OpenGL上下文后才能实例化这个类的对象。
相关文章:
- 是否可以使用 std::array 作为 POD 结构的数据容器?
- 如何为结构的数据元素赋值
- C++ - 使用用户输入的字符串数据检查结构字符串数据(无限执行 while 循环)
- sizeof 函数如何在带和不带位字段的结构上工作?(填充)
- 未使用的 asm() 在不受支持的体系结构上的行为
- 为什么我不能从结构将数据输入到字符数组中?
- 复制引用结构上的赋值
- 有了memory_order_relaxed,原子变量的总修改顺序如何在典型体系结构上得到保证
- 单独构造结构的数据成员合法吗
- C 嵌套结构上的 g++ 编译错误
- 结构上溢出的整数加法
- 在通过 P/Invoke 获取的 C++ 结构上设置 C# 回调
- 在包含浮点数的结构上使用 memset()
- 在模板化数据结构上调用 begin() 或 end()
- 在现有数据结构上使用BGL算法需要什么(边和顶点作为矢量<对象*>)?
- 使用提升库在队列和堆栈数据结构上保存和加载数据时出错
- 高速缓存行检索和在大型数据结构上的性能
- 如何在OpenGL中使用矢量和结构上传顶点数据
- 如何发送一个结构作为数据在UDP上使用SendBuffer
- 在不频繁更新的大型共享数据结构上预测计算潜在需要的值