我有一个非常大的问题一直困扰着我,我似乎无法找到解决方案。我已经下载了这个项目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