gpt4 book ai didi

c++ - 如何正确地将 OpenGL 代码添加到外部函数中

转载 作者:行者123 更新时间:2023-11-30 01:42:07 26 4
gpt4 key购买 nike

我正在尝试获取一些从顶点数组中绘制对象的 OpenGL 代码,并将其添加到类文件中。但是,代码只有在我的 main.cpp 文件中有它时才会运行。在进入绘制循环之前,我从 main() 函数中调用了 init()。

init(){
GLuint containerVAO, VBO;
glGenVertexArrays(1, &containerVAO);
glGenBuffers(1, &VBO);

glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

glBindVertexArray(containerVAO);
// Position attribute
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)0);
glEnableVertexAttribArray(0);
// Normal attribute
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat),(GLvoid*)(3 * sizeof(GLfloat)));
glEnableVertexAttribArray(1);
glBindVertexArray(0);
}

我绘制循环中的相关代码:

glUseProgram(noTextureShaderID);
glBindVertexArray(containerVAO);
///many different uniforms added here
glDrawArrays(GL_TRIANGLES, 0, 36);

创建立方体没问题。现在,当我替换 init() 函数中的代码时(初始化所有对象,而不仅仅是这个对象,我将其更改为:

init(){
square.init(noTextureShaderID, vertices[], NULL, 36);
//Square is a global variable within my main.cpp file
}

然后我使用这个函数:

void Mesh::init(const GLuint& shaderid, GLfloat vertices[], const char* tex_file, int num_vertices)
{
GLuint VBO;
vao = NULL; //This is a variable within the Mesh class
g_point_count = num_vertices;
glGenVertexArrays(1, &vao);
glGenBuffers(1, &VBO);

glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

glBindVertexArray(vao);
// Position attribute
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)0);
glEnableVertexAttribArray(0);
// Normal attribute
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));
glEnableVertexAttribArray(1);
glBindVertexArray(0);
}

然后,在我的绘制函数中,我改为调用它:

glUseProgram(noTextureShaderID);
glBindVertexArray(square.vao);
///many different uniforms added here
glDrawArrays(GL_TRIANGLES, 0, g_point_count);

但是即使两个程序看起来具有相同的代码,但只有第一个版本生成一个立方体。我在这方面缺少什么?

最佳答案

您的代码在这两种情况下都不相同,这与 OpenGL 无关:

void Mesh::init(const GLuint& shaderid, GLfloat vertices[], const char* tex_file, int num_vertices)
{
// ...
glBufferData(..., sizeof(vertices), ...);
}

vertices 在这里通过引用传递,内部函数永远不会看到数组,并且 sizeof(vertices) 将与 sizeof(GLfloat*) 相同,在今天的机器上通常是 4 或 8。因此,您的缓冲区仅包含前一个或两个 float 。

您要么必须明确提供数组大小作为附加参数,要么使用一些(对某个)更高级别的对象,例如 std:vector,它在内部完全管理数组并允许你查询尺寸。

关于c++ - 如何正确地将 OpenGL 代码添加到外部函数中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40070551/

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