Vux wrote a demo shader doing some simple UV mapping, planer, projected etc
Thought it would be really handy to have as a geometry shader with stream out.
I got a bit stuck though, technique invalid but no error msg, however if you put line 130 back in it’s valid again, so I guess the uv function is not fetching what it should…
//output.TexCd = input.TexCd;
Anyone can see what doing wrong?
float4x4 tW : WORLD;
float4x4 tWV : WORLDVIEW;
float4x4 tVP : VIEWPROJECTION;
float4x4 tWVP: WORLDVIEWPROJECTION;
float2 scale;
float2 offset;
- define PI 3.14159265f
- define HALFPI PI * 0.5f
- define TWOPI PI * 2.0f
//Interfaces and Classes definitions
interface iUVSpace
{
float4 Get(float4 p);
};
interface iUVMap
{
float2 GetUV(float4 p,float2 uv);
};
class cObjectUVSpace : iUVSpace
{
float4 Get(float4 p)
{
return p;
}
};
class cWorldUVSpace : iUVSpace
{
float4 Get(float4 p)
{
return mul(p,tW);
}
};
class cViewUVSpace : iUVSpace
{
float4 Get(float4 p)
{
return mul(p,tWV);
}
};
cObjectUVSpace objectuvspace;
cWorldUVSpace worlduvspace;
cViewUVSpace viewuvspace;
class cStandardUV : iUVMap
{
float2 GetUV(float4 p,float2 uv)
{
return uv;
}
};
class cPlanarXYUV : iUVMap
{
float2 GetUV(float4 p,float2 uv) { return p.xy * scale + offset; }
};
class cPlanarXZUV : iUVMap
{
float2 GetUV(float4 p,float2 uv) { return p.xz * scale + offset; }
};
class cPlanarYZUV : iUVMap
{
float2 GetUV(float4 p,float2 uv) { return p.yz * scale + offset; }
};
class cPerspectiveUV : iUVMap
{
float2 GetUV(float4 p,float2 uv)
{
float4 wvp = mul(p,tWVP);
return (wvp.xy / wvp.w) * scale + offset;
}
};
cStandardUV standard;
cPlanarXYUV planarxy;
cPlanarXZUV planarxz;
cPlanarYZUV planaryz;
cPerspectiveUV perspective;
iUVSpace space <string linkclass="objectuvspace,worlduvspace,viewuvspace";>;
iUVMap uvmap <string linkclass="standard,planarxy,planarxz,planaryz,perspective";>;
struct VS_IN
{
float4 PosO : POSITION;
float3 NormO : NORMAL;
float2 TexCd : TEXCOORD0;
};
struct VS_OUTPUT
{
float4 cpoint : POSITION;
float3 norm : NORMAL;
float2 TexCd : TEXCOORD;
};
VS_OUTPUT VS(VS_IN input)
{
//Here we simply passtrough the vertex data
VS_OUTPUT output;
float4 p = space.Get(input.PosO);
output.cpoint = input.PosO;
output.norm = input.NormO;
output.TexCd = uvmap.GetUV(p,input.TexCd);
//output.TexCd = input.TexCd;
return output;
}
[maxvertexcount(3)](maxvertexcount(3))
void GS(triangle VS_OUTPUT input[3](3), inout TriangleStream<VS_OUTPUT>GSOut)
{
VS_OUTPUT v;
for(uint i=0;i<3;i++)
{
v=input[i](i);
//v.position=v.position;
//v.TexCd=v.TexCd;
//v.normV=v.normV;
GSOut.Append(v);
}
}
GeometryShader StreamOutGS = ConstructGSWithSO( CompileShader( gs_5_0, GS() ), "POSITION.xyzw; NORMAL.xyz; TEXCOORD.xy", NULL, NULL, NULL, -1);
technique11 MeshSplit
{
pass P0
{
SetVertexShader( CompileShader( vs_5_0, VS() ) );
SetGeometryShader( CompileShader( gs_5_0, GS() ) );
SetGeometryShader( StreamOutGS );
}
}