顶点缓冲区问题
Vertex Buffer issues
我最近创建了这个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;
}
您可能应该将要绑定的内容传递给glBindBuffer
。glBindBuffer(GL_ARRAY_BUFFER, name)
我怀疑这会导致它崩溃,但是,当你调用glVertexAttribPointer
时,你传递的是3 * sizeof(float)
,而它应该是6 * sizeof(float)
,为什么?因为步幅应该是整个"顶点"的大小,在您的情况下,它包含位置和纹理坐标,总共有6个浮动。
当你打电话给glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)
时,你说计数是4,但据我所知,只有2。
"0x00000000处的访问冲突",如果没有检索到指向该函数的函数指针,你用什么来获取这些指针?我在评论中看到你使用SDL,但这对你没有任何帮助。你可以自己做,也可以使用GLEW。
相关文章:
- 我正在尝试使用回溯来解决 N queen 问题,但在编译时它会给出运行时错误(动态堆栈缓冲区溢出)
- 绘制的 OpenGL 点消失,绘制调用和交换缓冲区问题
- 将 char* 推送到矢量时出现问题,但在每次迭代后,它会将指向相同值缓冲区的指针添加到矢量中
- 缓冲区溢出 - 似乎无法找到问题
- 如何解决此缓冲区溢出问题?
- 设备驱动程序内存缓冲区处理器缓存问题
- GetProcessImageFileNameA 出现问题,缓冲区大小不足
- C++:循环缓冲区的问题
- Sprintf 缓冲区问题,错误分配给字符数组
- 这个流缓冲区有什么问题?
- 在 Python 中使用 OpenCV 将打包的 BGRA 图像缓冲区转换为 RGB 时遇到问题
- 协议缓冲区;将数据保存到磁盘并重新加载问题
- 字符串副本表示缓冲区太小,strcpy_s源问题
- 调整窗口大小后交换渲染缓冲区会导致问题
- 了解 DXGI DirectX 11 桌面复制以获取缓冲区或阵列的问题
- 尝试在 OSX 中创建多个帧缓冲区对象而不是 Linux 时出现问题
- 顶点缓冲区问题
- C++丢弃输入缓冲区问题中剩下的换行符
- mmap共享缓冲区读取问题
- 协议缓冲区,让C#与C++对话:类型问题和模式问题