XDRender_LightMode_Anisotropic(1) 各项异性着色(1)
2020-12-20 06:49
标签:smo eve att 向量 esc 红色 好处 strong 改变 @Author: 白袍小道 见笑各位大神 首先梳理一下和各项异性相关的知识和基础, 这里特别注意切线空间以及切线和副切线, 法线扰动. 下面做个大概列举, 论文和网络都有很详细的说明. 这里就不再继续展开. 外部链接: 1、http://www.bluevoid.com/opengl/sig00/advanced00/notes/node159.html 2、切线空间:https://zhuanlan.zhihu.com/p/139593847 1、还是和其他空间一样, 在这个空间描述的定义. 不能直接用于其他空间. (最好, 例外是两个空间恰好完全重叠,且坐标轴定义相同) https://developer.download.nvidia.com/CgTutorial/cg_tutorial_chapter08.html 2、注意这个空间是相对某一个采样点来说. 所以我们自然会想到他的好处-----法线纹理. 这里不做展开了. 3、N和UV不一定就垂直, 因为UV是个投影(我们理解为蒙一个布上去,特别是光滑且很细的凹凸不平) 4、T和B在哪里? 1、理想中的切线、法线、法线纹理、副切线 2、数学上的定义 3、其实TBN是一个坐标系定义, N确定了. T关键还是看顶点走向(不一定就是U也可能是V,甚至有偏差)。U和V TBN 一个空间转换矩阵, 定义为切线空间转换出来,或者逆矩阵反之. 这里假定了T是U相关的, (定义是指向U或V) 这部分属于Utils部分, a、需要查看计算好的切线,法线, 利用几何作色器部分,这里如果是Unity的话记得在Mac上使用OpenGLCoreAPI 大致代码 这里看到原始的Tangent横了,下面我们看下UV. 2.1 模型空间下的切线计算 2.2 世界空间下的切线(用来光照) 备注:这里也可以全部转到切线空间下进行计算 这里的GetNegativeScale() 使用是否反转副法线的,分量为- 1,否则为1。(这个变量我们可以按照Unity或者自己来, 存放到一个Float4的W中) 这里切线直接使用副切线, (由于制作模型的) 原因如下: 绿色是副切线,红色是切线 如果这里做一个Trik : 比如采样完计算好NormalWS,再求一次. (2)续 (2)续 传统公式, 注意一下dirAtten :https://www.zhihu.com/question/36946353/answer/361767154 参考文献 1、http://www.bluevoid.com/opengl/sig00/advanced00/notes/node159.html 2、https://github.com/mmikk/MikkTSpace/blob/master/mikktspace.c XDRender_LightMode_Anisotropic(1) 各项异性着色(1) 标签:smo eve att 向量 esc 红色 好处 strong 改变 原文地址:https://www.cnblogs.com/BaiPao-XD/p/13999655.htmlXDRender_LightMode_Anisotropic(1) 各项异性着色(1)
正文
理论基础关键点
各项异性
法线扰动
切线空间和切线
切线空间
切线、法线、法线纹理、副切线
实现
1、世界空间的法线和切线、UV量可视化
[maxvertexcount(9)]
void GS_Main(triangle v2g IN[3], inout LineStream
2、计算所需要的切线
real sign = tangentOS.w * GetOddNegativeScale();
tbn.normalWS = TransformObjectToWorldNormal(normalOS);
tbn.tangentWS = TransformObjectToWorldDir(tangentOS.xyz);
tbn.bitangentWS = cross(tbn.normalWS, tbn.tangentWS) * sign;
//2.1
float3 tangentWS = input.bitangentWS;
//float3 tangentWS = //cross(outSurfaceData.normalWS,input.tangentWS.xyz) * 0.7f;
//Cross src
//float3 tangentWS = //cross(input.normalWS,input.tangentWS.xyz) * 0.7f;
3、法线扰动
float3 ShiftTangent(float3 T, float3 N, float shift)
{
float3 shiftedT = T + (shift * N);
return normalize(shiftedT);
}
4、计算光照
漫反射部分
镜面反射部分
float StrandSpecular(float3 T, float3 V, float L, float exponent)
{
float3 H = normalize(L + V);
float dotTH = dot(T, H);
float sinTH = sqrt(1.0 - dotTH*dotTH);
float dirAtten = smoothstep(-1.0, 0.0, dot(T, H));
return dirAtten * pow(sinTH, exponent);
}
文章标题:XDRender_LightMode_Anisotropic(1) 各项异性着色(1)
文章链接:http://soscw.com/index.php/essay/37369.html