个人学习记录
-
安装glfw和glad并配置,参考博客:
Frank学习路上-【OpenGL】用GLFW和glad创建窗口
有glfw和glad创建窗口的代码 -
tips:
vs 报错:error: C1189: #error: OpenGL header already included, remove this include, glad already provides it
解决方法:GLAD的头文件包含了所需的OpenGL头文件(例如GL/gl.h),因此将GLAD需要置于在其它依赖于OpenGL的头文件(如GLFW)之前。把#include <glad/glad.h>置于#include <GLFW/glfw3.h>前,放最顶上
打开项目时需要点sln文件,直接从vs最近打开里打开
opengl中把别的地方的文件复制粘贴进来需要手动选择添加-现有项
课堂笔记
chapter 1:
opengl中都是记录的顶点的数据(三角形)
MVP变换:模型变换,平移旋转缩放,线代;观察变换,摄像机(摄像机永远看向摄像机坐标系的z轴),坐标轴;投影变换,3d投影到平面
chapter 2:shader
- 定义:
顶点缓冲对象:Vertex Buffer Object,VBO
顶点数组对象:Vertex Array Object,VAO
图形渲染管线:接受一组3D坐标,然后把它们转变为你屏幕上的有色2D像素输出的过程。
开始编程!!
首先以数组的形式传递3个3D坐标作为图形渲染管线的输入,用来表示一个三角形,这个数组叫做顶点数据(Vertex Data);顶点数据传入顶点着色器,它的输出传入片段着色器进行插值等操作并着色。fragmentshader进行插值操作,如给三角形着色等,
layout (location = 0) in vec3 aPos:在锚定点为0的地方放了一个三维的向量apos
out:输出
三角形顶点如下:
float vertices[] = {
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.0f, 0.5f, 0.0f
};
把它作为输入发送给图形渲染管线的第一个处理阶段:顶点着色器。它会在GPU上创建内存用于储存我们的顶点数据,这些顶点数据会储存在gpu中,由vertexshader对它进行空间变换的操作,通过顶点缓冲对象(Vertex Buffer Objects, VBO)管理这个内存。
构建vbo:
glGenBuffers(1, &VBO);//可以用来获取多个vbo的index,这里只传一个VBO
glBindBuffer(GL_ARRAY_BUFFER, VBO); //绑定GL_ARRAY_BUFFER这个vbo
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
//分配显存,给GL_ARRAY_BUFFER这个vbo分配,空间为sizeof(vertices),从vertices变量的开头开始读取,GL_STATIC_DRAW告诉opengl如何使用这个数据,是否会经常更改这个数据
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);
//针对layout=0这个点操作,一个顶点三个数据xyz,GL_FLOAT类型,不归一化,跨度为3个坐标,从开头读
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(sizeof(float) * 3));
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
shader的编译与链接
GLuint vertexShader;
vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
glCompileShader(vertexShader);
图片管理类封装
要实现图片管理,需要下一个stb_image.h放到项目目录中,地址为https://github.com/nothings/stb。
新建一个图片类,在这里我用的是前人写好的ffimage.h,传入一个图片的路径就可以读入这个图片并且解析构成i一个mage类的对象并返回。