Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 顶点缓冲区问题_C++_Opengl - Fatal编程技术网

C++ 顶点缓冲区问题

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> {

我最近创建了这个VertexBuffer类,并将其添加到基于opengl的引擎中;但它似乎在我的主代码中失败,导致“0x00000000的访问冲突”

下面是VertexBuffer.h:

#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封装到这样的类中是个好主意吗?你有什么更好的建议吗?我通常不这么做,但这不是一个坏主意。老实说,它有点乱,所以你可以改进一点,怎么做?恐怕我帮不了你:)