赞
踩
此处连接凹凸感文章
现在需要应用在立体的形状上
1、可视化切线空间
- /// <summary>
- /// 可视化切线空间
- /// </summary>
- public class TangentSpaceVisualizer : MonoBehaviour
- {
- public float offset = 0.01f;
- public float scale = 0.1f;
-
-
- private void OnDrawGizmos()
- {
- MeshFilter meshFilter = GetComponent<MeshFilter>();
- if (meshFilter != null)
- {
- //meshFilter.mesh 这个只是创建一个网格副本,游戏结束不会对原有网格造成影响
- Mesh mesh = meshFilter.sharedMesh;
- if(mesh)
- ShowTangentSpace(mesh);
- }
- }
-
- private void ShowTangentSpace(Mesh mesh)
- {
- Vector3[] vertices = mesh.vertices;
- Vector3[] normals = mesh.normals;
- Vector4[] tangents = mesh.tangents;
-
- for (int i = 0; i < vertices.Length; i++)
- {
- ShowTangentSpace(
- transform.TransformPoint(vertices[i]),
- transform.TransformDirection(normals[i]),
- transform.TransformDirection(tangents[i]),
- tangents[i].w
- );
- }
- }
-
- private void ShowTangentSpace(Vector3 vertex, Vector3 normal, Vector3 tangent, float binormalSign)
- {
- vertex += normal * offset;
- Gizmos.color = Color.green;
- Gizmos.DrawLine(vertex, vertex + normal * scale);
- //切线
- Gizmos.color = Color.red;
- Gizmos.DrawLine(vertex, vertex + tangent * scale);
- //次法线
- Vector3 binormal = Vector3.Cross(normal, tangent) * binormalSign;
- Gizmos.color = Color.blue;
- Gizmos.DrawLine(vertex, vertex + binormal * scale);
- }
- }
代码中的切线w中存储这次切线的方向, 因为cross得到2个向量,根据切线向量第4个分量中
2、Shader中处理切线空间
切线空间中:由法线N, 切线(T)和次法线(B)组成,俗称TBN这里有一个知识点:从A空间转换到B空间的矩阵是什么?A空间的基向量在B空间的表示按列排序,就成了A到B空间的转换矩阵
- float4 tangent : TANGENT; //切线 //定义
- 将切线转换到世界空间
- i.tangent = float4(UnityObjectToWorldDir(v.tangent.xyz), v.tangent.w);
-
- 初始化法线代码中
- float3 tangentSpaceNormal = BlendNormals(mainNormal, detailNormal);
- 下方替换了所以注释了
- // tangentSpaceNormal = tangentSpaceNormal.xzy;
- float3 binormal = cross(i.normal, i.tangent.xyz) * i.tangent.w; 计算次法线
- 从将法线从切线空间转换到世界方向
- i.normal = normalize(
- tangentSpaceNormal.x * i.tangent +
- tangentSpaceNormal.y * binormal +
- tangentSpaceNormal.z * i.normal);
- 在计算次法线时候(如果需要翻转),可以利用unity_WorldTransformParams
- float3 binormal = cross(i.normal, i.tangent.xyz) * (i.tangent.w * unity_WorldTransformParams.w);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。