gpt4 book ai didi

c++ - 如果我的 VBO 类引用顶点数组,数据是否仍存储在 GPU 上?

转载 作者:行者123 更新时间:2023-11-27 22:54:24 25 4
gpt4 key购买 nike

很简单,我的问题是这样的。下面是我的代码,用于跟踪和处理 OpenGL 中的顶点缓冲区对象的 C++ 头文件。为了符合核心标准,它必须使用顶点数组(VAO)。由于调用了glGenVertexArrays()等相关方法,那么这个渲染方法是否还有信息存储在GPU或RAM中?

class VertexBuffer
{
private:
int vertCount;

GLuint vertArray;
GLuint vertBuffer;

public:
VertexBuffer();
void renderInterleaved();
void createInterleaved(GLfloat*, int);
void destroy();

GLuint* getVboId();
};

VertexBuffer::VertexBuffer()
{
glGenVertexArrays(1, &vertArray);
glGenBuffers(1, &vertBuffer);
}

void VertexBuffer::renderInterleaved()
{
glBindVertexArray(vertArray);
glBindBuffer(GL_ARRAY_BUFFER, vertBuffer);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);

int stride = 7 * sizeof(GLfloat);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, stride, (void*) 0);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, stride, (void*)(3 * sizeof(GLfloat)));
glDrawArrays(GL_TRIANGLES, 0, vertCount);

glDisableVertexAttribArray(1);
glDisableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
}

void VertexBuffer::createInterleaved(GLfloat* data, int vertices)
{
vertCount = vertices;
glBindBuffer(GL_ARRAY_BUFFER, vertBuffer);
glBufferData(GL_ARRAY_BUFFER, vertices * 21 * sizeof(GLfloat), data, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
}

void VertexBuffer::destroy()
{
glDeleteBuffers(1, &vertBuffer);
glDeleteVertexArrays(1, &vertArray);
}

GLuint* VertexBuffer::getVboId()
{
return &vertBuffer;
}

最佳答案

术语“顶点缓冲区对象”是,并且一直是一个用词不当,由引入缓冲区对象的扩展的不幸命名造成的。

没有“顶点缓冲区对象”。只有一个 buffer object ,它表示 OpenGL 管理的内存的线性数组。缓冲区对象可用于存储用于渲染操作的顶点数据,但任何特定的缓冲区对象都内在无法做到这一点。这只是您如何使用它的问题。

如果您的对象封装了您将用于 glVertexAttribPointer 的参数,那么它就不仅仅是封装了一个缓冲区对象。缓冲区对象不知道如何呈现自身或它包含什么数据;它只是一个缓冲区。它所代表的最接近的 OpenGL 概念是顶点数组对象。

但是您的代码也没有真正使用 VAO。每次调用 renderInterleaved 时,您都会设置已作为 VAO 的一部分存储的状态。所有这些 glVertexAttribPointerglEnableVertexAttribArray 调用都记录到 VAO 中。这是你应该设置一次的东西,然后只需绑定(bind) VAO 并用它渲染。所以是的,它是一种效率较低的 VAO。

但是您的类封装的 比 VAO 多。它知道如何呈现自己。所以你的类(class)最好的名字是“网状”或类似的东西。

关于c++ - 如果我的 VBO 类引用顶点数组,数据是否仍存储在 GPU 上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34456505/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com