glBufferData与具有3个浮动(x, y和z)的垂直数组

glBufferData with an array of verticies that have 3 floats (x, y and z) each

本文关键字:数组 垂直 3个 glBufferData      更新时间:2023-10-16

目前我正试图通过网格类绘制一个三角形。我通过首先初始化辉光并调用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],所以形参不会衰变为指针。

我觉得自己像个十足的白痴…有一个顶点不在屏幕上。我想今天就到这里吧:/