gpt4 book ai didi

c++ - 如何将 new 和 delete 与 OpenGL 的缓冲区对象一起使用?

转载 作者:太空宇宙 更新时间:2023-11-03 10:39:54 26 4
gpt4 key购买 nike

我正在学习 OpenGL 并将其与 C++ 一起使用...如果这是一个愚蠢的问题,我很抱歉。

我按照本教程 (https://learnopengl.com/#!Getting-started/Hello-Triangle) 进行操作,并将代码拆分为创建片段着色器和顶点着色器并将其编译为单独的函数。显然,这意味着函数结束后对象将超出范围,因此我尝试对它们使用 new 和 delete。

我试过这样做:

GLuint * pvertexShader; //pointer to a GLuint
pvertexShader = new GLuint;

但不知道如何将实际的缓冲区对象放入我刚刚分配的新内存中。

我知道使用原始的新建/删除是不好的做法,所以我应该尝试使用智能指针吗?如果是这样,那将如何与 OpenGL 的对象一起使用?

或者我应该做一个包装类并将生成缓冲区的代码放入类构造函数中,这样就变成了这样:

class VBO;
(snip)
pvertexShader = new VBO; //the class is constructed on the heap

据我所知,当你为一个对象调用 new 时,它就会在堆上构建。如果我这样做,我是否仍然能够通过传递指针 pvertexShader 而不是实际的顶点着色器来使用 glBindBufferglAttachShader 之类的函数?所以写 glAttachShader(shaderprogram, pvertexShader)

编辑

好吧,现在我发现你所做的任何事情都是由 OpenGL 分配到 GPU 上的,所以你不必使用 new/delete。因为我正在做的是这样的:

SetUpVertexShader(){
//all the code to make and compile a shader
};

SetUpFragmentShader(){
//all the code to make and compile this shader
};

然后当我到达链接着色器和程序的阶段时,在这些函数中创建的两个着色器超出了范围(根据 XCode)。

我该如何预防/解决这个问题?

最佳答案

您使用 OpenGL 中的几乎所有内容分配的缓冲区的实际内存位于 GPU 中。 gl_buffer* 函数不会像您预期的那样返回内存数组的第一个地址,而是将一个 ID(GLuint 类型)插入到 id 参数中,然后您可以将其与其他 OpenGL 函数一起使用以处理内存在 GPU 中初始化。您不需要指向其地址的指针,OpenGL 只需要它在内部分配给缓冲区的编号。

这是一个说明这一点的小例子。

 // unsigned int to hold the ID that OpenGL will assign to this shader
GLuint sVertex;

sVertex = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(sVertex, 1, &vertexSource, NULL);
glCompileShader(sVertex);

注意这个顶点着色器是如何编译的,甚至没有移动它的地址。原因是 OpenGL 在 GPU 端为您管理,您所要做的就是使用包含 OpenGL 用于识别着色器的数字的 GLuint。

一开始它是违反直觉的,但这个系统确实有它的好处,例如,您可以仅使用其 (GLuint)ID 来移动任何类型的正确初始化的 GL 资源(如纹理或着色器)。

// texture_id contains the number that OpenGL uses to reference this particular texture in the GPU memory
void use_texture(GLuint texture_id);

关于c++ - 如何将 new 和 delete 与 OpenGL 的缓冲区对象一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43008633/

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