我有一个非常大的问题一直困扰着我这么久,我似乎无法找到解决方案。我已经下载了这个项目https://github.com/brianasu/unity-ray-marching/tree/volumetric-textures(Unitypackage 和我的项目在这里https://dl.dropboxusercontent.com/u/27758186/ApplicationVolume.unitypackage) ,那是关于体积渲染的。
问题在于,如您所见,体积总是呈现在其他所有事物之前(尝试将立方体放置在具有体积的立方体前面)。我尝试了很多东西,但似乎都没有。
我认为这可能是使用的着色器的问题。在主相机中,附加了一个 RayMarching 脚本,其中包含一个 OnRenderImage 方法,该方法创建一个新相机(尽管已禁用)并渲染体积。我不知道这是否是着色器问题,或者更像是相机问题(使用替换的着色器进行渲染)。我附上我当前的项目进行测试,这样你就不必从 git 下载,我只希望音量(头部)出现在矩形后面(看不到),当它实际上在后面时,在前面时,漂亮很像标准几何图形,但它总是出现在顶部......
任何帮助或建议将不胜感激,我有点绝望,因为任何事情都有效,我很确定这是一个相当简单的问题。
Ray Marching的shader代码如下。它是否应该进行某种 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