OpenGL 学习笔记- 基本概念
- 参考:https://ke.qq.com/course/427748
- 学习参考网址:
- opengl就是一个大的状态机(上下文),表示当前绘制的状态(光照设置,纹理设置,材质设置)
- GLFW 生成窗口,将上下文(context)告诉窗口,跨平台
- GLAD 在窗口中绘图,支持不同软硬件环境
- 输入3D坐标,输出2D 像素
- 图中着色器是可编程的,灰色表示已经写好了,不需要写
- VAO管理VBO
- GL_STATIC_DRAW:数据不会或几乎不会改变。
- GL_DYNAMIC_DRAW:数据会被改变很多。
- GL_STREAM_DRAW:数据每次绘制时都会改变。
- 步骤:
- 将着色器源码存入字符串
- 创建着色器对象
- 将源码字符串赋予着色器对象
- 编译着色器
- 创建着色器程序对象
- 将编译好的着色器附加到程序对象上
- 链接生成程序
- VAO\ VBO \EBO
- 代码参考
- main.cpp
#include <glad\glad.h> #include "Shader.h" #include <GLFW/glfw3.h> #include <cstdio> float vertices[] = { -0.5f,-0.5f,0.0f,//left,down 0.5f,-0.5f,0.0f,//right,down 0.5f, 0.5f,0.0f,//right,top -0.5f, 0.5f,0.0f//left,top }; unsigned int indices[] = { 0,1,3, 1,2,3 }; GLFWwindow* window; void init(); void VAOSet(); int main() { init(); VAOSet(); //渲染引擎 Shader myShader; glPolygonMode(GL_FRONT_AND_BACK,GL_FILL/*GL_LINE*/); while (!glfwWindowShouldClose(window)) { //设置颜色 glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); myShader.useShader(); //glUseProgram(shaderProgram);//使用程序 //glDrawArrays(GL_TRIANGLES,0,6);//画三角 glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); //接收事件 glfwPollEvents(); //交换缓存区 glfwSwapBuffers(window); } //退出 glfwTerminate(); return 0; } void VAOSet() { unsigned int VBO, VAO, EBO;//ID //生成VAO glGenVertexArrays(1, &VAO); //生成VBO glGenBuffers(1, &VBO); glGenBuffers(1, &EBO); //绑定VAO glBindVertexArray(VAO); //绑定一种类型缓冲,VBO glBindBuffer(GL_ARRAY_BUFFER, VBO); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); //往显卡写值,分配显存空间GL_STATIC_DRAW表示,值不修改 glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); //告诉显卡,值的结构 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); glEnableVertexAttribArray(0); } void init() { //初始化 glfwInit(); //设置版本 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); //设置模式 glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); //创建窗口 window = glfwCreateWindow(800, 600, "OPENGL", NULL, NULL); if (window == NULL) { printf("err:windows is NULL"); //退出 glfwTerminate(); return; } //将窗口与上下文绑定 glfwMakeContextCurrent(window); //初始化glad if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { printf("err:gladLoadGLLoader is NULL"); return; } }
- shader.h
#pragma once #include <glad\glad.h> #include <stdio.h> class Shader { public: int shaderProgram; void useShader(); Shader(void); ~Shader(void); };
- shader.cpp
#include "Shader.h" Shader::Shader(void) { const char * vertexShaderSource="#version 400 core\n" "layout(location=0) in vec3 aPos;\n" "void main()\n" "{\n" "gl_Position=vec4(aPos.x,aPos.y,aPos.z,1.0f);\n" "}\n\0"; const char * fragmentShaderSource="#version 400 core\n" "out vec4 FragColor;\n" "void main()\n" "{\n" "FragColor=vec4(1.0f,0.5f,0.2f,1.0f);\n" "}\n\0"; int vertexShader=glCreateShader(GL_VERTEX_SHADER);//创建着色器对象 glShaderSource(vertexShader,1,&vertexShaderSource,NULL);//绑定源码 glCompileShader(vertexShader);//编译着色器对象 int fragmentShader=glCreateShader(GL_FRAGMENT_SHADER);//创建着色器对象 glShaderSource(fragmentShader,1,&fragmentShaderSource,NULL);//绑定源码 glCompileShader(fragmentShader);//编译着色器对象 shaderProgram=glCreateProgram();//创建程序 glAttachShader(shaderProgram,vertexShader);//附加着色器对象 glAttachShader(shaderProgram,fragmentShader);//附加着色器对象 glLinkProgram(shaderProgram);//链接生成程序 } void Shader::useShader() { glUseProgram(shaderProgram); } Shader::~Shader(void) { }