DirectX9 / HLSL Shader Model 3 - Passing Doubles between Shaders
- by P. Avery
I need higher precision on a few values within my vertex and pixel shaders...I'm currently using floats, so I would like to use doubles...I've read that HLSL Model 4 has two functions to convert a double into two unsigned integers and back again( asuint() and asdouble() ). These functions are only supported on HLSL 4 and I am using DirectX 9 which will only compile HLSL Model 3 and below...
How can I pass a double between shaders?
here is implementation for HLSL 4:
struct VS_INPUT
{
float2 v;
};
struct PS_INPUT
{
uint a;
uint b;
uint c;
uint d;
};
PS_INPUT VertexShader( VS_INPUT Input )
{
PS_INPUT Output = ( PS_INPUT )0;
double2 vPos = mul( Input.v, mWorld ).xy;
asuint( vPos.x, Output.a, Output.b );
asuint( vPos.y, Output.c, Output.d );
return Output;
}
float4 PixelShader( PS_INPUT Input )
{
double2 vPos;
vPos.x = asdouble( Input.a, Input.b );
vPos.y = asdouble( Input.c, Input.d );
...
return 1;
}