最后几章大致看了例子,
1.卡通着色:主要是运用 “灰度纹理”,依据light和面片normal的点积,对应灰度纹理的纹理坐标
2.轮廓勾勒:主要运用vertex的扩充和每个vertex的normal进行vertex的延伸,记住同坐标点的vertex可能重复出现多次
比如现在面片三角ABC三个点,每条边扩充为四边形,则共12个点,每个点有自己的normal和两个临接面片的两个normal;
当时还疑惑一个vertex可能对应三个以上的临接面片吧?
原来是进行分别对待了,就是说vertex的position可能相同,但不属于扩充后的四边形;
轮廓勾勒例子过程:
1、对于每个面片,得到四个normal,自己的一个,临接三个normal
2. 每个面片,生成12个vertex;并绑定相应的normal和position
3. 判断是否为边缘点?是的话,则依据自身的normal进行延展
4.render扩充后的所有vertex
3.记住脚本里vector对于position等w默认为1;对于lightDirection、normal等向量要赋值w=0;
4.使用预处理方式设置vertex的FVF格式
5.blend是已经在后buffer的像素和正在光栅化的像素进行融合;
多重纹理同时启用若干层纹理
对于静态物体,预先进行光照计算,使用多重纹理达到高效。
6.最后是effect框架;
for(int j = 0; j < 4; j++) { ToonEffect->BeginPass(0);//写在循环外面会出错,如下图 WorldView = WorldMatrices[j] * view; WorldViewProj = WorldMatrices[j] * view * ProjMatrix; ToonEffect->SetMatrix(WorldViewHandle, &WorldView); ToonEffect->SetMatrix(WorldViewProjHandle, &WorldViewProj); ToonEffect->SetVector(ColorHandle, &MeshColors[j]); Meshes[j]->DrawSubset(0); ToonEffect->EndPass(); }
对于每个mesh,由于不同的constant和Matrix,需要renderPass相应的次数,否则会出现以最后一次的pass为准的情况;
时间: 2024-10-17 23:52:30