C++ 顶点缓冲区问题
我最近创建了这个VertexBuffer类,并将其添加到基于opengl的引擎中;但它似乎在我的主代码中失败,导致“0x00000000的访问冲突” 下面是VertexBuffer.h:C++ 顶点缓冲区问题,c++,opengl,C++,Opengl,我最近创建了这个VertexBuffer类,并将其添加到基于opengl的引擎中;但它似乎在我的主代码中失败,导致“0x00000000的访问冲突” 下面是VertexBuffer.h: #pragma once #include "Type.h" #include "Tags.h" namespace Spiky { namespace GLLayer { template<> struct GLObjDelAlloc<Tags::VertexBuffer> {
#pragma once
#include "Type.h"
#include "Tags.h"
namespace Spiky {
namespace GLLayer {
template<>
struct GLObjDelAlloc<Tags::VertexBuffer> {
static void Allocate(GLTypeCT<GLType::Integer> count,
Tags::VertexBuffer::internal* names) {
glGenBuffers(count, names);
}
static void Delete(GLTypeCT<GLType::Integer> count, Tags::VertexBuffer::internal* names) {
glDeleteBuffers(count, names);
}
};
template<>
struct GLObjBind<Tags::VertexBuffer> {
private:
static Tags::VertexBuffer::internal _active;
public:
static const int ZERO_BUFFER = GL_NONE;
static void BindRequest(Tags::VertexBuffer::internal name = ZERO_BUFFER) {
if(_active != name) {
glBindBuffer(GL_ARRAY_BUFFER, 0);
_active = name;
}
}
};
Tags::VertexBuffer::internal
GLObjBind<Tags::VertexBuffer>::_active = 0;
//wrapper around GLObjDelAlloc & GLObjBind
class VertexBuffer {
public:
explicit VertexBuffer() {
GLObjDelAlloc<Tags::VertexBuffer>::Allocate(1, &handle_);
}
inline void Bind() {
GLObjBind<Tags::VertexBuffer>::BindRequest(handle_);
}
template<typename T>
static void BufferData(const GLTypeCT<GLType::Integer> count, GLTypeCT<T>* data) {
glBufferData(GL_ARRAY_BUFFER, count *
sizeof(data->stride), data, GL_STATIC_DRAW);
}
VertexBuffer& operator=(const VertexBuffer& other) = delete;
VertexBuffer(const VertexBuffer& other) = delete;
private:
Tags::VertexBuffer::internal handle_;
};
} //namespace GLLayer
} //namespace Spiky
#pragma一次
#包括“h型”
#包括“Tags.h”
名称空间尖锐{
名称空间层{
模板
结构GLObjDelAlloc{
静态无效分配(GLTypeCT计数,
标记::VertexBuffer::内部*名称){
glGenBuffers(计数、名称);
}
静态无效删除(GLTypeCT计数,标记::VertexBuffer::内部*名称){
glDeleteBuffers(计数、名称);
}
};
模板
结构GLObjBind{
私人:
静态标签::VertexBuffer::内部_活动;
公众:
静态常量int ZERO_BUFFER=GL_NONE;
静态void BindRequest(标记::VertexBuffer::内部名称=零缓冲区){
如果(_active!=名称){
glBindBuffer(GL_数组_BUFFER,0);
_活动=名称;
}
}
};
标记::VertexBuffer::内部
GLObjBind::_active=0;
//环绕GLObjDelAlloc和GLObjBind的包装器
类顶点缓冲区{
公众:
显式VertexBuffer(){
GLObjDelAlloc::Allocate(1,&handle);
}
内联void Bind(){
GLObjBind::BindRequest(handle_);
}
模板
静态无效缓冲区数据(常量GLTypeCT计数,GLTypeCT*数据){
glBufferData(GL_数组_缓冲区,计数*
尺寸(数据->跨步)、数据、总图、静态图);
}
VertexBuffer和运算符=(常量VertexBuffer和其他)=删除;
顶点缓冲区(const VertexBuffer&other)=删除;
私人:
Tags::VertexBuffer::内部句柄;
};
}//名称空间层
}//名称空间尖锐
以下是我的主要观点:
int main(int argc, char** args)
{
GLTypeCT<GLfloat> quadVertices[] = {
// Positions // Texture Coords
-1.0f, 1.0f, 0.0f, -1.0f, -1.0f, 0.0f,
1.0f, 1.0f, 0.0f, 1.0f, -1.0f, 0.0f,
};
// Setup plane VAO
glGenVertexArrays(1, &quadVAO);
VertexBuffer buffer{};
glBindVertexArray(quadVAO);
buffer.Bind();
VertexBuffer::BufferData(12, quadVertices);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat),
(GLvoid*)(0));
glBindVertexArray(0);
auto RenderQuad = [&] {
glBindVertexArray(quadVAO);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glBindVertexArray(0);
};
//render calls later on...
}
intmain(intargc,char**args)
{
GLTypeCT四顶点[]={
//位置//纹理坐标
-1.0f,1.0f,0.0f,-1.0f,-1.0f,0.0f,
1.0f,1.0f,0.0f,1.0f,-1.0f,0.0f,
};
//安装平面VAO
Glgenvertexarray(1和quadVAO);
顶点缓冲区{};
glBindVertexArray(quadVAO);
buffer.Bind();
VertexBuffer::BufferData(12个四顶点);
GlenableVertexAttributeArray(0);
glvertexattributepointer(0,3,GL_FLOAT,GL_FALSE,3*sizeof(GLfloat),
(GLvoid*)(0));
glBindVertexArray(0);
自动渲染四边形=[&]{
glBindVertexArray(quadVAO);
gldrawArray(GL_三角带,0,4);
glBindVertexArray(0);
};
//稍后呈现调用。。。
}
您认为错误来自VertexBuffer吗 我在这里看到了一些可能的问题 但首先,1280意味着GL_无效_ENUM,你从哪里得到的?在哪个opengl调用之后 在这方面:
static void BindRequest(Tags::VertexBuffer::internal name = ZERO_BUFFER) {
if(_active != name) {
glBindBuffer(GL_ARRAY_BUFFER, 0);
_active = name;
}
您可能应该传递要绑定的内容<代码>glBindBuffer(GL\u数组\u BUFFER,名称)
我怀疑这会导致它崩溃,但当您调用glvertexattributepointer
时,您传递的是3*sizeof(float)
它应该是6*sizeof(float)
,为什么?因为步幅应该是整个“顶点”的大小,在您的例子中,包含位置和texcoords,总计为6个浮动
当你调用glDrawArrays(GL\u TRIANGLE\u STRIP,0,4)
时,你说计数是4,但据我所知,只有2
“0x00000000处的访问冲突”,如果没有检索到指向该函数的函数指针,您将使用什么来获取这些指针?我在评论中看到您使用SDL,但这对您没有任何帮助。您可以自己做,也可以使用GLEW。根据调试器,访问冲突位于何处?另外:确保所有GL调用都成功(cfr.
glGetError
),并且正确完成清理(我发现VBO没有解除绑定)@Marco A1)VS告诉我错误来自glDrawArrays();2) 通过计算glGeterror,我得到了error#1280;这意味着什么吗?@Gernote;SDL22)3*sizeof(float)实际上还可以,因为我只使用顶点位置:它用于渲染全屏四边形,所以我可以简单地调用glFragCoord;但我留下texCoords只是为了调试:)3)不过是最后一个问题;您认为将VertexBuffer封装到这样的类中是个好主意吗?你有什么更好的建议吗?我通常不这么做,但这不是一个坏主意。老实说,它有点乱,所以你可以改进一点,怎么做?恐怕我帮不了你:)