迄今为止,2D平面就已经差不多OK了。为了更好的学习3D,总结一些需要注意的小细节或者是小套路。
首先,还是要多写代码,好多东西都是记住的
使用
glfw
那一套一定要熟练哦~glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL", NULL, NULL); if (window == NULL) { std::cout << "window init error" << std::endl; glfwTerminate(); return -1; } glfwMakeContextCurrent(window); glewExperimental = true; if (glewInit() != GLEW_OK) { std::cout << "glew init error" << std::endl; glfwTerminate(); return -1; } glViewport(0, 0, 800, 600); while (!glfwWindowShouldClose(window)) { pressInput(window); glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glfwSwapBuffers(window); glfwPollEvents(); }
起码开个窗口不能有问题。
要深刻理解VAO,VBO,EBO之间的关系
- VAO叫顶点数据对象,里面有一个Array Buffer和一个Element Buffer。
- VBO缓冲到Array Buffer,EBO缓冲到Element Buffer。
- 这三种对象的初始化一定要会。
着色器编译连接那一套,理解的基础上,自己封装一个完整的Shader类。可以复用哦~
着色器(GLSL)一定要自己写,个人觉得这个是OpenGL的精髓,重点是理解uniform这个东西(相当于全局变量)
#version version_number in type in_variable_name; in type in_variable_name; out type out_variable_name; uniform type uniform_name; int main() { // 处理输入并进行一些图形操作 ... // 输出处理过的结果到输出变量 out_variable_name = weird_stuff_we_processed; }
纹理(Texture)记住下面的步骤应该没问题
//创建纹理 unsigned int texture; glGenTextures(1, &texture); //绑定纹理 glBindTexture(GL_TEXTURE_2D,texture); //设置环绕和过滤方式 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); //加载并生成纹理 int width, height, nrChannels; unsigned char *data = stbi_load("container.jpg", &width, &height, &nrChannels, 0); if (data){ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data); glGenerateMipmap(GL_TEXTURE_2D); } else{ std::cout << "Failed to load texture" << std::endl; } //释放图像内存 stbi_image_free(data);
- 纹理坐标是储存到顶点数据中的,所以要对应更改VertexShader和顶点数据的读取方式
纹理单元
- 应用与多个纹理同时渲染的情况
- 使用时记得先激活再绑定