顶点缓冲区问题

Vertex Buffer issues

本文关键字:问题 缓冲区 顶点      更新时间:2023-10-16

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

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

但首先,1280的意思是GL_INVALID_ENUM,你从哪里得到的?在哪个opengl调用之后?

在此:

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

您可能应该将要绑定的内容传递给glBindBufferglBindBuffer(GL_ARRAY_BUFFER, name)

我怀疑这会导致它崩溃,但是,当你调用glVertexAttribPointer时,你传递的是3 * sizeof(float),而它应该是6 * sizeof(float),为什么?因为步幅应该是整个"顶点"的大小,在您的情况下,它包含位置和纹理坐标,总共有6个浮动。

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

"0x00000000处的访问冲突",如果没有检索到指向该函数的函数指针,你用什么来获取这些指针?我在评论中看到你使用SDL,但这对你没有任何帮助。你可以自己做,也可以使用GLEW。