C# 体积光线始终在其他对象的顶部进行渲染

C# 体积光线始终在其他对象的顶部进行渲染,c#,sorting,unity3d,shader,zbuffer,C#,Sorting,Unity3d,Shader,Zbuffer,我有一个非常大的问题困扰了我这么久,我似乎找不到解决办法。我已经下载了这个关于体绘制的项目(这里有我的项目的Unitypackage) 问题是,正如您所看到的,卷始终在所有其他对象之前渲染(尝试将一个立方体与卷一起放置在立方体的前面)。我试过很多东西,但似乎都不管用 我认为这可能是使用着色器的问题。在主摄影机中,附加了一个光线行进脚本,该脚本包含一个OnRenderImage方法,该方法创建一个新摄影机(尽管已禁用),并渲染体积。 我不知道这是一个着色器问题,还是更像一个摄影机问题(使用替换的着

我有一个非常大的问题困扰了我这么久,我似乎找不到解决办法。我已经下载了这个关于体绘制的项目(这里有我的项目的Unitypackage)

问题是,正如您所看到的,卷始终在所有其他对象之前渲染(尝试将一个立方体与卷一起放置在立方体的前面)。我试过很多东西,但似乎都不管用

我认为这可能是使用着色器的问题。在主摄影机中,附加了一个光线行进脚本,该脚本包含一个OnRenderImage方法,该方法创建一个新摄影机(尽管已禁用),并渲染体积。 我不知道这是一个着色器问题,还是更像一个摄影机问题(使用替换的着色器进行渲染)。我附加了我当前的项目进行测试,所以你不必从git下载,我只希望体积(头部)在矩形后面(看不见),当它实际在后面时,它出现在前面,非常像一个标准几何体,但它总是出现在顶部

任何帮助或建议都将不胜感激,我有点绝望,因为任何事情都能奏效,我很确定这是一个相当容易的问题

光线行进着色器的代码如下所示。它是否应该进行某种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
着色器“隐藏/光线行进/光线行进”
{
CGINCLUDE
#包括“UnityCG.cginc”
#布拉格目标3.0
#pragma profileoption MaxLocalParams=1024
#pragma profileoption NumInstructionSlots=4096
#pragma profileoption NumMathInstructionSlots=4096
结构v2f{
浮动4位:位置;
float2-uv[2]:TEXCOORD0;
};
采样器3D _VolumeTex;
float4_VolumeTex_TexelSize;
取样器2D_FrontTex;
取样器2D_BackTex;
浮动4_LightDir;
浮动4_LightPos;
浮动尺寸;
浮动不透明度;
浮动4_ClipDims;
浮动4_ClipPlane;
v2f垂直(appdata\U img v)
{
v2fo;
o、 pos=mul(单位矩阵MVP,v顶点);
o、 uv[0]=v.texcoord.xy;
o、 uv[1]=v.texcoord.xy;
#如果着色器_API_D3D9
如果(_MainTex_TexelSize.y<0)
o、 uv[0].y=1-o.uv[0].y;
#恩迪夫
返回o;
}
#定义总步骤128.0
#定义步骤128
#定义步长为1/128.0
半4光线三月(v2f i,浮动偏移)
{
float3-frontPos=tex2D(_-FrontTex,i.uv[1]).xyz;
float3 backPos=tex2D(_BackTex,i.uv[1]).xyz;
float3 dir=后POS-前POS;
float3 pos=frontPos;
浮动4 dst=0;
float3 stepDist=dir*步长大小;
对于(int k=0;k
我在Unity Engine github.com/smkplus/UnityRayMarchingI中实现了Raymarching在Unity Engine github.com/smkplus/UnityRayMarching中实现了Raymarching