文件名称:着色器代码-python实现pdf转换成word/txt纯文本文件
文件大小:5.52MB
文件格式:PDF
更新时间:2024-07-08 20:40:57
DX11 Direcx 图形学
18.6 着色器代码 我们将法线贴图映射的一般处理过程总结如下: 1.使用某个绘图软件或工具软件创建法线贴图,并保存为图像文件。当程序初始化 时,从这些文件创建 2D 纹理。 2.为每个三角形计算切线向量 T。在网格中,顶点 v 的切线向量等于共享该顶点的每 个三角形的切线向量的平均值。(在我们的演示程序中,我们为简单几何体直接指定切线向 量,为那些从 3D 建模软件导出的复杂三角形网格计算平均值。) 3.在顶点着色器中将顶点的法线向量和切线向量变换到世界空间,然后将结果输出到 像素着色器。 4.使用插值后的切线向量和法线向量,为三角形表面上的每个像素点生成 TBN 基。 使用 TBN 基,将从法线贴图采样得到的法线向量从切线空间变换到世界空间。最后将法线 向量用于光照计算。 要实现法线法线贴图映射,我们需要在 lighthelper.fx 中添加以下函数: //--------------------------------------------------------------- ---------------------- // 将法线贴图的采样值转换到世界空间. //--------------------------------------------------------------- ---------------------- float3 NormalSampleToWorldSpace(float3 normalMapSample, float3 unitNormalW, float3 tangentW) { // 将每个分量从[0,1]解压到[-1,1]. float3 normalT = 2.0f*normalMapSample - 1.0f; // 创建 TBN基. float3 N = unitNormalW; float3 T = normalize(tangentW - dot(tangentW, N)*N); float3 B = cross(N, T); float3x3 TBN = float3x3(T, B, N); // 从切线空间转换到世界空间. float3 bumpedNormalW = mul(normalT, TBN); return bumpedNormalW; } 这个函数在像素着色器中的使用方法如下: float3 normalMapSample = gNormalMap.Sample(samLinear, 346 / 351