学习教程来自:GAMES202-高质量实时渲染
笔记
1. Basic GPU hardware pipeline
渲染管线
## 2. OPenGL
是一系列在CPU端调用的API用来调用GPU工作。
1. 优点:跨平台。
2. 缺点:碎片化,有很多版本。语言风格为C style,非面向对象。
渲染过程类比:
1. 放置物体/模型:模型声明(VBO),模型变换矩阵(glTranslate等)
2. 放置画架:声明相机(gluPerspective等),使用/声明一个FrameBuffer
3. 画布和画架关系:一个Pass可以输出多个Texture(MRT),Fragment Shader决定了其内容
4. 在画布上作画:着色。本课程重点在顶点着色器、片元着色器2个部分
## 3. OpenGL Shading Language (GLSL)
描述着色器如何着色的语言:着色器语言经过编译变为在GPU上执行的汇编语言
1. HLSL for DX(vertex + pixel)
2. GLSL for OpenGL(vertex + fragment)
一些变量的声明
1. attribute:顶点着色器中的本地变量
2. uniform:固定的全局变量
3. varying:顶点着色器的变量插值后送给片元着色器
4. highp:高精度
### 3.1 Debug
工具:Nsight Graphics、RenderDoc
方法:打印颜色
## 4. The Rendering Equation
正确的用来描述光线传播的公式
PBR:
In Real Time Rendering:对入射光源是否被遮挡(V)单独描述
作业
作业0:在框架里实现Bulin-Phong,所有代码已给出
碰到的问题:
没有渲染出来是因为uViewMatrix和uViewMatrix这2个矩阵没有传过来,需要
- 在Material.js中this.#flatten_uniforms部分声明这2个参数
- 在MeshRender.js的Draw函数中定义对应的2个矩阵,然后通过gl.uniformMatrix4fv函数传给下一层(参考作业1中的对应代码)
如果没有对vFragPos进行世界空间的转换而仅仅将aVertexPosition传入,那么原本(52,52,52)的缩放就没有起作用,导致光线的衰减是基于(1,1,1)缩放后的世界空间位置计算的
最终效果