从VR中的片段着色器中抽取屏幕空间纹理?

时间:2017-10-19 13:12:40

标签: unity3d fragment-shader virtual-reality

我一直致力于Unity着色器设置,其中包含两个VR项目的视觉效果。

  • 模糊的轮廓发光。这很好。
  • '内发光'型效果。这在VR /立体视觉中不起作用,但在单视场渲染中效果很好。

Images and schematic here.

似乎这个过程的红色部分没有按预期工作。当我在片段的计算屏幕位置处对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结果,这是有效的。然而,在那时我们基本上执行两次相同(昂贵)的计算。如果可能的话,我想避免这种解决方案。

的问题:

  • 我是否尝试做一些从根本上不适用于VR /立体镜的东西?
  • 如果没有,我如何获得给定片段的正确屏幕空间UV坐标,从VR中的纹理中采样?

非常感谢提前!

0 个答案:

没有答案