我一直致力于Unity着色器设置,其中包含两个VR项目的视觉效果。
似乎这个过程的红色部分没有按预期工作。当我在片段的计算屏幕位置处对Prepass
RenderTexture进行采样时,它在渲染时不与模型对齐。结果,“内部发光”被抵消。应在彩色区域内的样品落在外面,反之亦然。
“红色”垂直着色器:
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
// Get screen position of vertex so we can sample _GlowPrePassTex in screenspace
o.screenpos = ComputeScreenPos(o.vertex);
return o;
}
“红色”碎片着色器:
fixed4 frag (v2f i) : SV_Target
{
// Get rim component
half tDot = saturate(dot(i.normal, i.viewdir));
// Sample from _GlowPrePassTex at the fragment's screenspace position
float2 screenUV = i.screenpos.xy / i.screenpos.w;
#if UNITY_SINGLE_PASS_STEREO
float4 scaleOffset = unity_StereoScaleOffset[unity_StereoEyeIndex];
screenUV = (screenUV - scaleOffset.zw) / scaleOffset.xy; // I don't know?
#endif
fixed4 hlSample = tex2D(_GlowPrePassTex, screenUV);
// Standard hard rim
fixed4 col = _RimColor * pow(1.0 - tDot, _RimExponent);
// Modulate hlSample by (softer) rim strength and add to result
col += hlSample * pow(1.0 - tDot, _HLExponent);
return col;
}
我查看了this Unity manual page上的样本并尝试了相关的样本(其中一个包含在上面的片段着色器中),但无济于事。我不确定每个人应该达到的目标以及使用它们的顺序。 Sideproblem:如果我们切换到单通道立体声,许多其他效果将停止工作,需要调整。
我还编写了一个版本,在“红色”片段着色器本身内重新计算Prepass结果,这是有效的。然而,在那时我们基本上执行两次相同(昂贵)的计算。如果可能的话,我想避免这种解决方案。
非常感谢提前!