1 Star 1 Fork 0

promoter / openglLearn

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

openglLearn

教程地址:https://learnopengl-cn.github.io/

介绍

opengl 基本理论笔记回顾

基础知识

固定渲染管线和核心模式

立即渲染模式(Immediate mode,固定渲染管线)和核心模式(Core-profile, opengl3.2开始)。

流行的几个库

最流行的几个库有GLUT,SDL,SFML和GLFW。

glfw:https://www.glfw.org/download.html

glda:http://glad.dav1d.de/

正常开始工作:

#include <glad/glad.h> #include <GLFW/glfw3.h>

VAO,VBO,IBO

  • 顶点数组对象:Vertex Array Object,VAO

  • 顶点缓冲对象:Vertex Buffer Object,VBO

  • 索引缓冲对象:Element Buffer Object,EBO或Index Buffer Object,IBO

    vertex_array_objects_ebo

管线(Pipeline)

3D坐标转为2D坐标的处理过程是由OpenGL的图形渲染管线(Graphics Pipeline,实际上指的是一堆原始图形数据途经一个输送管道,期间经过各种变化处理最终出现在屏幕的过程)管理的。图形渲染管线可以被划分为两个主要部分:第一部分把你的3D坐标转换为2D坐标,第二部分是把2D坐标转变为实际的有颜色的像素。

pipeline

着色器(Shader)

在GPU上为每一个(渲染管线)阶段运行各自的小程序,从而在图形渲染管线中快速处理你的数据。这些小程序叫做着色器(Shader)。

OpenGL着色器是用OpenGL着色器语言(OpenGL Shading Language, GLSL)写成。

现代OpenGL需要我们至少设置一个顶点和一个片段着色器.

顶点着色器(Vertex Shader)

顶点着色器需要为它的输入提供一个额外的layout标识。

片段着色器(Fragment Shader)

主要目的是计算一个像素的最终颜色,这也是所有OpenGL高级效果产生的地方。通常,片段着色器包含3D场景的数据(比如光照、阴影、光的颜色等等),这些数据可以被用来计算最终像素的颜色。

GLSL
#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;
}

数据类型包括:基本的数据类型(int、uint、float、double、bool)、量(Vector, vecN、bvecN、ivecN等)和矩阵(Matrix).

Uniform是一种从CPU中的应用向GPU中的着色器发送数据的方式,但uniform和顶点属性有些不同。首先,uniform是全局的(Global)。全局意味着uniform变量必须在每个着色器程序对象中都是独一无二的,而且它可以被着色器程序的任意着色器在任意阶段访问。第二,无论你把uniform值设置成什么,uniform会一直保存它们的数据,直到它们被重置或更新。

采样器(Sampler):它以纹理类型作为后缀,比如sampler1D、sampler3D.

纹理(Texture)

stb_image.h库是一个单头文件图像加载库。

生成一个纹理的过程应该看起来像这样:

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);

混合 丢弃片段:GLSL给了我们discard命令,一旦被调用,它就会保证片段不会被进一步处理,所以就不会进入颜色缓冲 不要打乱顺序: 当绘制一个有不透明和透明物体的场景的时候,大体的原则如下: 先绘制所有不透明的物体。 对所有透明的物体排序。 按顺序绘制所有透明的物体(先远后近)。

空文件

简介

opengl 基本理论笔记回顾 展开 收起
C
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
C
1
https://gitee.com/promoter/opengl-learn.git
git@gitee.com:promoter/opengl-learn.git
promoter
opengl-learn
openglLearn
master

搜索帮助