C# 体积光线始终在其他对象的顶部进行渲染
我有一个非常大的问题困扰了我这么久,我似乎找不到解决办法。我已经下载了这个关于体绘制的项目(这里有我的项目的Unitypackage) 问题是,正如您所看到的,卷始终在所有其他对象之前渲染(尝试将一个立方体与卷一起放置在立方体的前面)。我试过很多东西,但似乎都不管用 我认为这可能是使用着色器的问题。在主摄影机中,附加了一个光线行进脚本,该脚本包含一个OnRenderImage方法,该方法创建一个新摄影机(尽管已禁用),并渲染体积。 我不知道这是一个着色器问题,还是更像一个摄影机问题(使用替换的着色器进行渲染)。我附加了我当前的项目进行测试,所以你不必从git下载,我只希望体积(头部)在矩形后面(看不见),当它实际在后面时,它出现在前面,非常像一个标准几何体,但它总是出现在顶部 任何帮助或建议都将不胜感激,我有点绝望,因为任何事情都能奏效,我很确定这是一个相当容易的问题 光线行进着色器的代码如下所示。它是否应该进行某种ZTesting,以不显示任何其他对象所覆盖的碎片C# 体积光线始终在其他对象的顶部进行渲染,c#,sorting,unity3d,shader,zbuffer,C#,Sorting,Unity3d,Shader,Zbuffer,我有一个非常大的问题困扰了我这么久,我似乎找不到解决办法。我已经下载了这个关于体绘制的项目(这里有我的项目的Unitypackage) 问题是,正如您所看到的,卷始终在所有其他对象之前渲染(尝试将一个立方体与卷一起放置在立方体的前面)。我试过很多东西,但似乎都不管用 我认为这可能是使用着色器的问题。在主摄影机中,附加了一个光线行进脚本,该脚本包含一个OnRenderImage方法,该方法创建一个新摄影机(尽管已禁用),并渲染体积。 我不知道这是一个着色器问题,还是更像一个摄影机问题(使用替换的着
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