glBufferData与具有3个浮动(x, y和z)的垂直数组
glBufferData with an array of verticies that have 3 floats (x, y and z) each
目前我正试图通过网格类绘制一个三角形。我通过首先初始化辉光并调用Window来做到这一点。我的窗口类的initializeGraphics方法,然后创建一个垂直数组并传递给我的网格。addVerticies方法。每个顶点有3个浮点数,x, y和z。然后我调用Mesh。在主游戏循环的每一秒绘制方法
initializeGraphics方法:
void Window::initializeGraphics()
{
glClearColor(0, 0, 0, 0);
glFrontFace(GL_CW);
glCullFace(GL_BACK);
glEnable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);
glEnable(GL_FRAMEBUFFER_SRGB);
}
创建网格:
m_Mesh = Mesh();
Vertex data[] = { Vertex(vec3(-1, -1, 0)),
Vertex(vec3(1, -1, 0)),
Vertex(vec3(0, 1, 0)) };
m_Mesh.addVerticies(data);
网格头:
#include "vertex.h"
#include <GLEWglew>
class Mesh
{
private:
GLuint m_Vbo;
int m_Size;
public:
Mesh();
void addVerticies(Vertex verticies[]);
void draw();
};
Mesh c++ File:
#include "mesh.h"
Mesh::Mesh()
{
glGenBuffers(1, &m_Vbo);
}
void Mesh::addVerticies(Vertex verticies[])
{
m_Size = (sizeof(verticies) / sizeof(*verticies));
glBindBuffer(GL_ARRAY_BUFFER, m_Vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(verticies), verticies, GL_STATIC_DRAW);
}
void Mesh::draw()
{
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, m_Vbo);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * 4, 0);
glDrawArrays(GL_TRIANGLES, 0, m_Size);
glDisableVertexAttribArray(0);
}
顶点标题:
#include "vec3.h"
struct Vertex
{
union
{
vec3 pos;
struct
{
float x, y, z;
};
};
Vertex(vec3 pos_);
};
Vertex c++ File:
#Include "vertex.h"
Vertex::Vertex(vec3 pos_)
{
pos = pos_;
}
渲染方法:
void MainComponent::render()
{
m_Window.clear();
m_Mesh.draw();
m_Window.update();
}
//m_Window.update();
void Window::update()
{
glfwSwapBuffers(m_GLFWWindow);
glfwPollEvents();
}
//m_Window.clear();
void Window::clear()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
问题是,屏幕上没有三角形。我做错了什么?我还是一个c++新手,这是我第一次编程OpenGl,所以它可能是一些我一直忽略的非常非常基本的东西。
提前感谢您的努力。
肖恩
等等!这里还有其他真正的错误。
void Mesh::addVerticies(Vertex verticies[])
{
// This gives the wrong answer!
m_Size = (sizeof(verticies) / sizeof(*verticies));
m_Size
的计算是完全错误的。这是因为verticies
是一个指针而不是数组。它看起来像一个数组,它被声明为Vertex verticies[]
,但由于c++的一个怪调(同样适用于C),参数衰减为一个指针。所以它最终和这个一样:
void Mesh::addVerticies(Vertex *verticies)
如您所见,sizeof(verticies)
在典型的64位系统上总是将为8,因为您只是获得指针的大小,而不是数组的大小。
我们可以通过模板捕获数组的大小来解决这个问题:
template <std::size_t N>
void addVertices(Vertex (&vertices)[N]) {
addVertices(vertices, N);
}
void addVertices(Vertex *vertices, std::size_t count) {
m_Size = count;
glBindBuffer(GL_ARRAY_BUFFER, m_Vbo);
glBufferData(
GL_ARRAY_BUFFER,
sizeof(*vertices) * count,
vertices,
GL_STATIC_DRAW);
}
因为使用了指向数组Vertex (&vertices)[N]
的引用,而不是直接指向数组Vertex vertices[N]
,所以形参不会衰变为指针。
我觉得自己像个十足的白痴…有一个顶点不在屏幕上。我想今天就到这里吧:/
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 使用指针从C++中的数组中获取最大值
- C++使用整数的压缩数组初始化对象
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '