我开始学习OpenGL。到目前为止,我做得还不错,唯一的问题是我不确切地知道哪个是最好的"组织该计划的方式。例如,很多教程在main()函数上按顺序构造所有代码,我认为这不是很好。其他人将构建render(),init()等函数,并在main()函数上调用它们。
现在我正在尝试混合,我构建了一个包装GLFW和GLEW库的类,我在main()上调用它们。我还有init()和render()函数。我遇到的问题是我必须将(GLuint程序)声明为全局变量,这是不可取的。这是我可以使渲染函数也使用变量的唯一方法。 这是代码:
#define GLEW_STATIC
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include "GLWrapper.h"
#include "GLShader.h"
#include <iostream>
#include <ctime>
using namespace std;
GLuint program;
void renderer() {
glClear(GL_COLOR_BUFFER_BIT);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
float time = float(clock()) / float(CLOCKS_PER_SEC);
GLint uniColor = glGetUniformLocation(program, "triangleColor");
glUniform3f(uniColor, (sin(time * 4.0f) + 1.0f) / 2.0f, cos(time*2), 0.0f);
glDrawArrays(GL_TRIANGLES, 0, 3);
}
void init() {
float vertices[] = {
0.0f, 0.5f, // Vertex 1 (X, Y)
0.5f, -0.5f, // Vertex 2 (X, Y)
-0.5f, -0.5f // Vertex 3 (X, Y)
};
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
GLuint vbo;
glGenBuffers(1, &vbo); // Generate 1 buffer
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
program = LoadShader("Shader.vert", "Shader.frag");
glUseProgram(program);
}
int main() {
GLWrapper *glw = new GLWrapper(800, 600, "Ola Mundo!");
glw->setRenderer(renderer);
init();
GLint posAttrib = glGetAttribLocation(program, "position");
glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(posAttrib);
glw->glMainLoop();
delete(glw);
return 0;
}
所以,我想知道如果有更好的方法来组织这个代码(或许建立一个类?),因为我将构建越来越大的代码,我希望它们尽可能有条理。
希望我能说清楚。