Still testing and changing.
If useful, here is the shader:
cbuffer ConstantObjectBuffer : register (b0)
{
matrix worldMatrix;
float3 StepSize;
float Iterations;
float4 ScaleFactor;
};
#define Side 2
cbuffer ConstantFrameBuffer : register (b1)
{
matrix viewMatrix;
matrix projectionMatrix;
float3 eyepos;
float cppad;
float4 lightvec;
float4 lightcol;
float FogStart;
float FogEnd;
float2 __space;
float3 FogColor;
float shadows;
float SpecularIntensity;
float3 pad3;
float4 SpecularColor;
}
//***************************************************//
// VERTEX SHADER //
//***************************************************//
struct VOut
{
float4 position : SV_POSITION;
float3 texC : TEXCOORD0;
float4 pos : TEXCOORD1;
float2 texcoord : TEXCOORD2;
float3 normal : NORM;
};
struct GlobalIn
{
float4 position : POSITION;
float4 normal : NORMAL;
float2 texcoord : TEXCOORD;
float4 tangent : TANGENT;
};
**CE_RESERVED_SHADER[INPUTS]**
Texture3D t_VolData : register(t0);
Texture2D t_TransFront : register(t1);
Texture2D t_TransBack : register(t2);
SamplerState ss;
VOut VShader(GlobalIn input)
{
VOut output;
input.position.w = 1.0f;
output.texcoord = input.texcoord;
// Calculate the position of the vertex against the world, view, and projection matrices.
output.position = mul(input.position, worldMatrix);
output.position = mul(output.position, viewMatrix);
output.position = mul(output.position, projectionMatrix);
output.texC = input.position;
output.pos = output.position;
output.normal = mul(float4(input.normal.xyz,0), worldMatrix);
return output;
}
//***************************************************//
// PIXEL SHADER //
//***************************************************//
struct POut
{
float4 Diffuse : SV_Target0;
float4 Position : SV_Target1;
float4 Depth : SV_Target2;
float4 Normals : SV_Target3;
float4 Lighting : SV_Target4;
};
// Functions
float4 GetVRaycast(VOut input)
{
//calculate projective texture coordinates
//used to project the front and back position textures onto the cube
float2 texC = input.pos.xy /= input.pos.w;
texC.x = 0.5f*texC.x + 0.5f;
texC.y = -0.5f*texC.y + 0.5f;
float3 front = t_TransFront.Sample(ss, texC).xyz;
float3 back = t_TransBack.Sample(ss, texC).xyz;
float3 dir = normalize(back - front);
float4 pos = float4(front, 0);
float4 dst = float4(0, 0, 0, 0);
float4 src = 0;
float value = 0;
float3 Step = dir * StepSize;
for(int i = 0; i < 32; i++)
{
pos.w = 0;
value = t_VolData.Sample(ss, pos).r;
src = (float4)value;
src.a *= .5f; //reduce the alpha to have a more transparent result
//Front to back blending
// dst.rgb = dst.rgb + (1 - dst.a) * src.a * src.rgb
// dst.a = dst.a + (1 - dst.a) * src.a
src.rgb *= src.a;
dst = (1.0f - dst.a)*src + dst;
//break from the loop when alpha gets high enough
if(dst.a >= .95f)
break;
//advance the current position
pos.xyz += Step;
//break if the position is greater than <1, 1, 1>
if(pos.x > 1.0f || pos.y > 1.0f || pos.z > 1.0f)
break;
}
return dst;
}
POut PShader(VOut input)
{
POut output;
// Depth
output.Depth = float4(0, 0, 0, 1.0f);
// Normals
output.Normals = float4(normalize(input.normal), 1);
output.Position = float4(0, 0, 0, 1);
output.Lighting = float4(1, 1, 1, 1);
output.Diffuse = GetVRaycast(input);
return output;
}
Thanks!
-MIGI0027