Volume Ray Marching总是在其他对象之上呈现

时间:2015-08-04 17:55:52

标签: c# sorting unity3d shader zbuffer

我有一个非常大的问题一直困扰着我,我似乎无法找到解决方案。我已经下载了这个项目https://github.com/brianasu/unity-ray-marching/tree/volumetric-textures(Unitypackage和我的项目https://dl.dropboxusercontent.com/u/27758186/ApplicationVolume.unitypackage),这是关于体积渲染的。

问题在于,正如您所看到的那样,卷总是在其他所有内容之前呈现(尝试将多维数据集放在具有该卷的多维数据集前面)。我尝试了很多东西,但似乎都没有。

我认为这可能是使用着色器的问题。在主Camera中,附加了一个RayMarching脚本,其中包含一个OnRenderImage方法,该方法创建一个新的Camera(虽然已禁用),并呈现该卷。 我不知道它是否是着色器问题,或更像是相机问题(使用替换着色器进行渲染)。我附上我当前的项目进行测试,所以你不必从git下载,我只是想让音量(头部)出现在矩形(未看到)后面,当它实际上在后面时,在前面,当它是,漂亮很像标准的几何形状,但它总是出现在顶部......

任何帮助或建议都会非常感激,我有点绝望,因为任何有效的东西,我很确定这是一个相当容易的问题。

Ray Marching着色器的代码如下。是否应该进行某种ZTesting以不显示任何其他对象所覆盖的片段?

Shader "Hidden/Ray Marching/Ray Marching" 
{

CGINCLUDE

#include "UnityCG.cginc"
#pragma target 3.0
#pragma profileoption MaxLocalParams=1024 
#pragma profileoption NumInstructionSlots=4096
#pragma profileoption NumMathInstructionSlots=4096

struct v2f {
    float4 pos : POSITION;
    float2 uv[2] : TEXCOORD0;
};

sampler3D _VolumeTex;
float4 _VolumeTex_TexelSize;

sampler2D _FrontTex;
sampler2D _BackTex;

float4 _LightDir;
float4 _LightPos;

float _Dimensions;

float _Opacity;
float4 _ClipDims;   
float4 _ClipPlane;

v2f vert( appdata_img v ) 
{
    v2f o;
    o.pos = mul(UNITY_MATRIX_MVP, v.vertex);

    o.uv[0] = v.texcoord.xy;
    o.uv[1] = v.texcoord.xy;
    #if SHADER_API_D3D9
    if (_MainTex_TexelSize.y < 0)
        o.uv[0].y = 1-o.uv[0].y;
    #endif          
    return o;
}

#define TOTAL_STEPS 128.0
#define STEP_CNT 128
#define STEP_SIZE 1 / 128.0

half4 raymarch(v2f i, float offset) 
{
    float3 frontPos = tex2D(_FrontTex, i.uv[1]).xyz;        
    float3 backPos = tex2D(_BackTex, i.uv[1]).xyz;              
    float3 dir = backPos - frontPos;
    float3 pos = frontPos;
    float4 dst = 0;
    float3 stepDist = dir * STEP_SIZE;


    for(int k = 0; k < STEP_CNT; k++)
    {
        float4 src = tex3D(_VolumeTex, pos);

        // clipping
        float border = step(1 - _ClipDims.x, pos.x);
        border *= step(pos.y, _ClipDims.y);
        border *= step(pos.z, _ClipDims.z);
        border *= step(0, dot(_ClipPlane, float4(pos - 0.5, 1)) + _ClipPlane.w);

        // Standard blending            
        src.a *= saturate(_Opacity * border);
        src.rgb *= src.a;
        dst = (1.0f - dst.a) * src + dst;

        pos += stepDist;
    }

    return 3.0F*dst;// + dst;
}

ENDCG

Subshader {

Fog { Mode off }


Pass 
{
    CGPROGRAM
    #pragma vertex vert
    #pragma fragment frag

    half4 frag(v2f i) : COLOR { 

    return raymarch(i, 0); 
    }   
    ENDCG
}                   
}

Fallback off

} // shader

0 个答案:

没有答案