110 lines
3.8 KiB
Markdown
110 lines
3.8 KiB
Markdown
|
## PBR Refrection(有问题)
|
|||
|
```
|
|||
|
//input anteriorChamberDepth 贴图 使用HeightMap
|
|||
|
//input radius
|
|||
|
//input mask 贴图
|
|||
|
//input texcoord
|
|||
|
//input n 折射率比值
|
|||
|
//input frontNormalW 贴图float3(0,0,1) Local=>World
|
|||
|
|
|||
|
// 角膜区域突起的模型 height = max(-positionL.z – eyeIrisDepth, 0.0);
|
|||
|
// 球形模型 Plot[Max[1.0 - 18.4 * r * r, 0.0], {r, 0, 0.3}]
|
|||
|
float height = anteriorChamberDepth ;//* saturate( 1.0 - 18.4 * radius * radius );
|
|||
|
|
|||
|
float3 normalW=Parameters.WorldNormal;
|
|||
|
float3 viewW= mul(float3(0,0,1),(float3x3)View.ViewToTranslatedWorld);//CameraViewToTranslatedWorld
|
|||
|
|
|||
|
// refractedW
|
|||
|
float w = n * dot( normalW, viewW );
|
|||
|
float k = sqrt( 1.0 + ( w - n ) * ( w + n ) );
|
|||
|
float3 refractedW = ( w - k ) * normalW - n * viewW;
|
|||
|
refractedW=-normalize(refractedW);
|
|||
|
|
|||
|
//float3 frontNormalW=mul(float(0,0,1),float(3x3)GetPrimitiveData(Parameters.PrimitiveId).LocalToWorld) * -1;
|
|||
|
float cosAlpha = dot(frontNormalW, refractedW);
|
|||
|
float dist = height / cosAlpha;
|
|||
|
float3 offsetW = dist * refractedW;
|
|||
|
float2 offsetL = mul(offsetW, (float3x2)GetPrimitiveData(Parameters.PrimitiveId).WorldToLocal);
|
|||
|
texcoord += float2(mask, -mask) * offsetL;
|
|||
|
|
|||
|
return texcoord;
|
|||
|
```
|
|||
|
### 原始代码
|
|||
|
```
|
|||
|
// 角膜区域突起的模型
|
|||
|
// Alternatively, use a displacement map
|
|||
|
// height = max(-positionL.z – eyeIrisDepth, 0.0);
|
|||
|
|
|||
|
// 球形模型
|
|||
|
// Plot[Max[1.0 - 18.4 * r * r, 0.0], {r, 0, 0.3}]
|
|||
|
height = anteriorChamberDepth * saturate( 1.0 - 18.4 * radius * radius );
|
|||
|
|
|||
|
// refractedW
|
|||
|
float w = n * dot( normalW, viewW );
|
|||
|
float k = sqrt( 1.0 + ( w - n ) * ( w + n ) );
|
|||
|
float3 refractedW = ( w - k ) * normalW - n * viewW;
|
|||
|
|
|||
|
float cosAlpha = dot(frontNormalW, -refractedW);
|
|||
|
float dist = height / cosAlpha;
|
|||
|
float3 offsetW = dist * refractedW;
|
|||
|
float2 offsetL = mul(offsetW, (float3x2) worldInverse);
|
|||
|
texcoord += float2(mask, -mask) * offsetL;
|
|||
|
```
|
|||
|
## Matcap反射效果
|
|||
|
```
|
|||
|
float2 CalcMatcapUV(FMaterialPixelParameters Parameters,float3 normalTexture)
|
|||
|
{
|
|||
|
float3 ViewVector=Parameters.CameraVector * -1;
|
|||
|
float3 ViewSpaceRightVector=normalize(cross(ViewVector , mul( float3(0.0,1.0,0.0) , ResolvedView.ViewToTranslatedWorld )));
|
|||
|
float3 ViewSpaceUpVector=cross(ViewVector ,ViewSpaceRightVector);
|
|||
|
|
|||
|
float3x3 Matrix=float3x3(
|
|||
|
ViewSpaceRightVector.x,ViewSpaceUpVector.x,ViewVector.x,
|
|||
|
ViewSpaceRightVector.y,ViewSpaceUpVector.y,ViewVector.y,
|
|||
|
ViewSpaceRightVector.z,ViewSpaceUpVector.z,ViewVector.z
|
|||
|
);
|
|||
|
|
|||
|
float3 ZeroOneNormal=mul(normalize(Parameters.WorldNormal+normalTexture),Matrix)*0.5+0.5;
|
|||
|
return float2(ZeroOneNormal.x,ZeroOneNormal.y*-1);
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
### 这个不太行
|
|||
|
```
|
|||
|
//input normalTexture 法线贴图
|
|||
|
float3 TangentWS=Parameters.TangentToWorld[0];
|
|||
|
float3 NormalWS=Parameters.TangentToWorld[2];
|
|||
|
float3 BinormalWS=cross(NormalWS, TangentWS);
|
|||
|
|
|||
|
float3 worldNormal;
|
|||
|
worldNormal.x = dot(float3(TangentWS.x,BinormalWS.x,NormalWS.x), normalTexture);
|
|||
|
worldNormal.y = dot(float3(TangentWS.y,BinormalWS.y,NormalWS.y), normalTexture);
|
|||
|
worldNormal.z = dot(float3(TangentWS.z,BinormalWS.z,NormalWS.z), normalTexture);
|
|||
|
worldNormal = normalize(worldNormal);
|
|||
|
|
|||
|
float3 e = normalize(GetWorldPosition(Parameters) - ResolvedView.WorldCameraOrigin);
|
|||
|
float3 reflectVector = reflect(e, worldNormal);
|
|||
|
float3 reflectVectorVS = normalize(mul(reflectVector,ResolvedView.TranslatedWorldToView));
|
|||
|
float m = 2.82842712474619 * sqrt(reflectVectorVS.z + 1.0);
|
|||
|
float2 cap = reflectVectorVS.xy / m + 0.5;
|
|||
|
cap=cap*0.5 + 0.5;
|
|||
|
return cap;
|
|||
|
```
|
|||
|
|
|||
|
## 高光贴图位置调整
|
|||
|
```
|
|||
|
//input float2 LeftUp,LeftDown,RightUp,RightDown;
|
|||
|
|
|||
|
float3 viewW = mul(float3(0,0,1),(float3x3)View.ViewToTranslatedWorld);
|
|||
|
float3 viewL = mul(viewW, (float3x2)GetPrimitiveData(Parameters.PrimitiveId).WorldToLocal);
|
|||
|
float2 viewL2D = normalize(viewL.xy);
|
|||
|
|
|||
|
float2 Left=lerp(LeftUp,LeftDown,viewL2D.y);
|
|||
|
float2 Right=lerp(RightUp,RightDown,viewL2D.y);
|
|||
|
return lerp(Left,Right,viewL2D.x);
|
|||
|
```
|
|||
|
## 焦散
|
|||
|
- dot(Parameters.WorldNormal,View.DirectionalLightDirection);
|
|||
|
- Fresnel
|
|||
|
|
|||
|
乘以焦散Mask即可
|