顶点缓冲区问题

时间:2016-01-02 17:13:40

标签: c++ opengl

我最近创建了这个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

这是我的主要内容:

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

}

您认为错误来自VertexBuffer吗?

1 个答案:

答案 0 :(得分:0)

我在这里看到了一些可能的问题。

但首先,1280意味着GL_INVALID_ENUM,你在哪里得到这个?在哪个opengl之后调用?

在此:

static void BindRequest(Tags::VertexBuffer::internal name = ZERO_BUFFER) {
if(_active != name) {
  glBindBuffer(GL_ARRAY_BUFFER, 0);
  _active = name;
}

您应该传递glBindBuffer要绑定的内容。 glBindBuffer(GL_ARRAY_BUFFER, name)

我怀疑这会导致它崩溃但是,当你致电glVertexAttribPointer时,你应该3 * sizeof(float)传递它6 * sizeof(float),为什么?因为步幅应该是整个“顶点”的大小,在你的情况下包含位置和texcoords,总计最多6个浮点数。

当你打电话给glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)时,你说的是计数是4,但据我所知,它只有2。

“0x00000000处的访问冲突”,如果尚未检索到该函数的函数指针,那么你得到了什么来获取这些指针?我在评论中看到你使用SDL,但这对你没有任何帮助。您可以自己动手或使用GLEW。