URP中获取常用数据(模型数据,常用矢量等)的方法
直接使用unity内置Core函数(需要包含):
1.点位置数据:GetVertexPositionInputs()
unity内置函数:
VertexPositionInputs GetVertexPositionInputs(float3 positionOS)
{
VertexPositionInputs input;
input.positionWS = TransformObjectToWorld(positionOS);
input.positionVS = TransformWorldToView(input.positionWS);
input.positionCS = TransformWorldToHClip(input.positionWS);
float4 ndc = input.positionCS * 0.5f;
input.positionNDC.xy = float2(ndc.x, ndc.y * _ProjectionParams.x) + ndc.w;
input.positionNDC.zw = input.positionCS.zw;
return input;
}
使用示例:
VertexPositionInputs vertexInput = GetVertexPositionInputs(input.positionOS.xyz);
output.positionCS = vertexInput.positionCS;
output.positionWS = vertexInput.positionWS;
2.点法线数据:GetVertexNormalInputs()
unity内置函数:
VertexNormalInputs GetVertexNormalInputs(float3 normalOS)
{
VertexNormalInputs tbn;
tbn.tangentWS = real3(1.0, 0.0, 0.0);
tbn.bitangentWS = real3(0.0, 1.0, 0.0);
tbn.normalWS = TransformObjectToWorldNormal(normalOS);
return tbn;
}
使用示例:
VertexNormalInputs normalInput = GetVertexNormalInputs(input.normalOS, input.tangentOS);
output.normalWS.xyz = normalInput.normalWS;
output.tangentWS.xyz = normalInput.tangentWS;
output.bitangentWS.xyz = normalInput.bitangentWS;
3.世界空间视线方向(摄像机方向):GetWorldSpaceViewDir()
使用示例:
half3 viewDirWS = GetWorldSpaceViewDir(vertexInput.positionWS);
4.获取屏幕空间坐标:
使用到的 unity内置函数:
使用示例:
struct Varying
{
float4 screenPos : TEXCOORD1; //第一步:定义输出结构成员
flaot4 PosCS : SV_POSITION;
}
Varying vert(Attibute v)
{
Varying o;
o.PosCS = TransformObjectToHClip(v.vertex.xyz);
o.screenPos = ComputeScreenPos(o.PosCS); //第二步:使用HLSL内置函数计算屏幕空间坐标
return o;
}
half4 frag(Varying i) : SV_Target
{
float2 uv = i.screenPos.xy / i.screenPos.w; //第三步:除以w,得到屏幕空间UV
float4 cameraDepthTex =SAMPLE_TEXTURE2D(_CameraDepthTexture,sampler_CameraDepthTexture,uv);
float depthTex = Linear01Depth(cameraDepthTex,_ZBufferParams);
return depthTex;
}
5.获取主光矢量方向(世界空间下):
unity内置函数:
(#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl")
使用示例:
Light light = GetMainLight();
half3 worldLightDir = normalize(light.direction);
继续更新...
引用: