学习教程来自:GAMES202-高质量实时渲染
笔记
1. Basic GPU hardware pipeline

2. OPenGL
是一系列在CPU端调用的API用来调用GPU工作。
- 优点:跨平台。
- 缺点:碎片化,有很多版本。语言风格为C style,非面向对象。
渲染过程类比:
- 放置物体/模型:模型声明(VBO),模型变换矩阵(glTranslate等)
- 放置画架:声明相机(gluPerspective等),使用/声明一个FrameBuffer
- 画布和画架关系:一个Pass可以输出多个Texture(MRT),Fragment Shader决定了其内容
- 在画布上作画:着色。本课程重点在顶点着色器、片元着色器2个部分
3. OpenGL Shading Language (GLSL)
描述着色器如何着色的语言:着色器语言经过编译变为在GPU上执行的汇编语言
- HLSL for DX(vertex + pixel)
- GLSL for OpenGL(vertex + fragment)
一些变量的声明
- attribute:顶点着色器中的本地变量
- uniform:固定的全局变量
- varying:顶点着色器的变量插值后送给片元着色器
- highp:高精度
3.1 Debug
工具:Nsight Graphics、RenderDoc
方法:打印颜色
4. The Rendering Equation
正确的用来描述光线传播的公式
PBR:
L
o
(
p
,
ω
o
)
=
L
e
(
p
,
ω
o
)
+
∫
H
2
f
r
(
p
,
ω
i
→
ω
o
)
L
i
(
p
,
ω
i
)
cos
θ
i
d
w
i
L_o(p, \omega_o) = L_e(p, \omega_o) + \int_{H^2}^{}f_r(p, \omega_i \to \omega_o) L_i(p, \omega_i) \cos \theta_i dw_i
Lo(p,ωo)=Le(p,ωo)+∫H2fr(p,ωi→ωo)Li(p,ωi)cosθidwi
In Real Time Rendering:对入射光源是否被遮挡(V)单独描述
L o ( p , ω o ) = ∫ Ω + L i ( p , ω i ) f r ( p , ω i , ω o ) cos θ i V ( p , ω i ) d w i L_o(p, \omega_o) = \int_{\Omega^+}^{}L_i(p, \omega_i) f_r(p, \omega_i, \omega_o) \cos \theta_i V(p, \omega_i) dw_i Lo(p,ωo)=∫Ω+Li(p,ωi)fr(p,ωi,ωo)cosθiV(p,ωi)dwi
作业
作业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)缩放后的世界空间位置计算的