设置近远平面是因为变换到标准立方体之后的精度。
单纯用 Z-buffer 肯定是不行的。
考虑颜色混合模型如下(注意 alpha 和颜色分开存储):
$$ \boldsymbol a = [r_A, g_A, b_A]^{\rm T} \\ \boldsymbol b = [r_B, g_B, b_B]^{\rm T} \\ \boldsymbol c_{ab} = \alpha_A \boldsymbol a + (1-\alpha_A)\alpha_B \boldsymbol b, \ \ \ \ \ \alpha_{C_{ab}} = \alpha_A + (1-\alpha_A)\alpha_B \\ \boldsymbol c_{ba} = \alpha_B \boldsymbol b + (1-\alpha_B)\alpha_A \boldsymbol a, \ \ \ \ \ \alpha_{C_{ba}} = \alpha_B + (1-\alpha_B)\alpha_A
$$
可以发现颜色依赖于顺序。
考虑一个预乘模型:
$$ \boldsymbol a = [\alpha_A r_A, \alpha_A g_A, \alpha_A b_A, \alpha_A] \\ \boldsymbol b = [\alpha_B r_B, \alpha_B g_B, \alpha_B b_B, \alpha_B] \\
\boldsymbol c_{ba} = \boldsymbol b + (1-\alpha_B) \boldsymbol a $$
上采样:如放大图像,生成插值。
非预乘可能带来的影响:边缘发黑。
① Z-buffer test + update 开始渲染各个不透明对象。
② 关掉 Z-buffer update 但仍然做 test,从后往前逐个渲染半透明表面,如果被不透明对象遮挡住了,就不参与绘制。
Transform triangle vertices into camera space (modeling and camera transform)