Sign in to follow this  
noxic

Geometry Shader problems

Recommended Posts

Hi everyone! My first post here on gamedev^^ I have a problem with my shader which I will try and explain. Would appreciate some help, since I can't figure out this problem. Quite recently I updated my DirectX SDK to Aug 2009. When I did that, a project I had stoped working (it was working with the SDK I had before). Some of the shader code: struct GS_OUTPUT { float4 Position : SV_POSITION; // vertex position float4 Color : COLOR0; // color }; int the Geometry shader: { . . . GS_OUTPUT output; output.Color = float4(vertlist[triTable[cubeindex][i+2]].Normal, 1.0); output.Position = vertlist[vertlist[triTable[cubeindex][i+2]].Position; //Gives error X4580: emitting a system-interpreted value which is not written in every execution path of the shader Stream.Append( output ); . . . } while this works: { . . . GS_OUTPUT output; output.Color = float4(vertlist[triTable[cubeindex][i+2]].Normal, 1.0); //instead of cubeindex, I for example put 1 and instead of i+2 I put 3, then it works. output.Position = vertlist[vertlist[triTable[1][3]].Position; Stream.Append( output ); . . . } Does it have something to do with SV_POSITION since it works for Color? I have tried to google the problem, but can't find anything helpful :/ Thanks a lot in advance!

Share this post


Link to post
Share on other sites
It would help to have your whole shader so that we can try out a few things and narrow down your problem.

Several questions come to mind such as how many components in vertlist[vertlist[triTable[cubeindex][i+2]].Position and what is your [maxvertexcount()] attribute for the geometry shader. Also, providing the whole thing might let us help suggest a work around if there is a real issue.

Share this post


Link to post
Share on other sites
Here is the entire shader code. Hope this helps better to solve it. The shader is for the Marching Cubes algorithm.
I have not come up with this code myself, so I will not take "credit" for it. I've looked at Nvidias Metaballs sample, and at this http://brugevin.boris.free.fr/phpBB2/viewtopic.php?t=52 example since I wanted to learn about this algorithm. I understand almost everything of this algorithm, so I will try and code my own soon.



cbuffer cb0 : register(b0)
{
float isolevel;
};

Buffer<float4> VertexBuffer : register(t0);

cbuffer cb1 : register(b1)
{
static const int edgeTable[256]=
{0x0 , 0x109, 0x203, 0x30a, 0x406, 0x50f, 0x605, 0x70c,
0x80c, 0x905, 0xa0f, 0xb06, 0xc0a, 0xd03, 0xe09, 0xf00,
0x190, 0x99 , 0x393, 0x29a, 0x596, 0x49f, 0x795, 0x69c,
0x99c, 0x895, 0xb9f, 0xa96, 0xd9a, 0xc93, 0xf99, 0xe90,
0x230, 0x339, 0x33 , 0x13a, 0x636, 0x73f, 0x435, 0x53c,
0xa3c, 0xb35, 0x83f, 0x936, 0xe3a, 0xf33, 0xc39, 0xd30,
0x3a0, 0x2a9, 0x1a3, 0xaa , 0x7a6, 0x6af, 0x5a5, 0x4ac,
0xbac, 0xaa5, 0x9af, 0x8a6, 0xfaa, 0xea3, 0xda9, 0xca0,
0x460, 0x569, 0x663, 0x76a, 0x66 , 0x16f, 0x265, 0x36c,
0xc6c, 0xd65, 0xe6f, 0xf66, 0x86a, 0x963, 0xa69, 0xb60,
0x5f0, 0x4f9, 0x7f3, 0x6fa, 0x1f6, 0xff , 0x3f5, 0x2fc,
0xdfc, 0xcf5, 0xfff, 0xef6, 0x9fa, 0x8f3, 0xbf9, 0xaf0,
0x650, 0x759, 0x453, 0x55a, 0x256, 0x35f, 0x55 , 0x15c,
0xe5c, 0xf55, 0xc5f, 0xd56, 0xa5a, 0xb53, 0x859, 0x950,
0x7c0, 0x6c9, 0x5c3, 0x4ca, 0x3c6, 0x2cf, 0x1c5, 0xcc ,
0xfcc, 0xec5, 0xdcf, 0xcc6, 0xbca, 0xac3, 0x9c9, 0x8c0,
0x8c0, 0x9c9, 0xac3, 0xbca, 0xcc6, 0xdcf, 0xec5, 0xfcc,
0xcc , 0x1c5, 0x2cf, 0x3c6, 0x4ca, 0x5c3, 0x6c9, 0x7c0,
0x950, 0x859, 0xb53, 0xa5a, 0xd56, 0xc5f, 0xf55, 0xe5c,
0x15c, 0x55 , 0x35f, 0x256, 0x55a, 0x453, 0x759, 0x650,
0xaf0, 0xbf9, 0x8f3, 0x9fa, 0xef6, 0xfff, 0xcf5, 0xdfc,
0x2fc, 0x3f5, 0xff , 0x1f6, 0x6fa, 0x7f3, 0x4f9, 0x5f0,
0xb60, 0xa69, 0x963, 0x86a, 0xf66, 0xe6f, 0xd65, 0xc6c,
0x36c, 0x265, 0x16f, 0x66 , 0x76a, 0x663, 0x569, 0x460,
0xca0, 0xda9, 0xea3, 0xfaa, 0x8a6, 0x9af, 0xaa5, 0xbac,
0x4ac, 0x5a5, 0x6af, 0x7a6, 0xaa , 0x1a3, 0x2a9, 0x3a0,
0xd30, 0xc39, 0xf33, 0xe3a, 0x936, 0x83f, 0xb35, 0xa3c,
0x53c, 0x435, 0x73f, 0x636, 0x13a, 0x33 , 0x339, 0x230,
0xe90, 0xf99, 0xc93, 0xd9a, 0xa96, 0xb9f, 0x895, 0x99c,
0x69c, 0x795, 0x49f, 0x596, 0x29a, 0x393, 0x99 , 0x190,
0xf00, 0xe09, 0xd03, 0xc0a, 0xb06, 0xa0f, 0x905, 0x80c,
0x70c, 0x605, 0x50f, 0x406, 0x30a, 0x203, 0x109, 0x0};
};

cbuffer cb2 : register(b2)
{
static const int triTable[256][16] =
{{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{1, 8, 3, 9, 8, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 8, 3, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{9, 2, 10, 0, 2, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{2, 8, 3, 2, 10, 8, 10, 9, 8, -1, -1, -1, -1, -1, -1, -1},
{3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 11, 2, 8, 11, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{1, 9, 0, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{1, 11, 2, 1, 9, 11, 9, 8, 11, -1, -1, -1, -1, -1, -1, -1},
{3, 10, 1, 11, 10, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 10, 1, 0, 8, 10, 8, 11, 10, -1, -1, -1, -1, -1, -1, -1},
{3, 9, 0, 3, 11, 9, 11, 10, 9, -1, -1, -1, -1, -1, -1, -1},
{9, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{4, 3, 0, 7, 3, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 1, 9, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{4, 1, 9, 4, 7, 1, 7, 3, 1, -1, -1, -1, -1, -1, -1, -1},
{1, 2, 10, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{3, 4, 7, 3, 0, 4, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1},
{9, 2, 10, 9, 0, 2, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1},
{2, 10, 9, 2, 9, 7, 2, 7, 3, 7, 9, 4, -1, -1, -1, -1},
{8, 4, 7, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{11, 4, 7, 11, 2, 4, 2, 0, 4, -1, -1, -1, -1, -1, -1, -1},
{9, 0, 1, 8, 4, 7, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1},
{4, 7, 11, 9, 4, 11, 9, 11, 2, 9, 2, 1, -1, -1, -1, -1},
{3, 10, 1, 3, 11, 10, 7, 8, 4, -1, -1, -1, -1, -1, -1, -1},
{1, 11, 10, 1, 4, 11, 1, 0, 4, 7, 11, 4, -1, -1, -1, -1},
{4, 7, 8, 9, 0, 11, 9, 11, 10, 11, 0, 3, -1, -1, -1, -1},
{4, 7, 11, 4, 11, 9, 9, 11, 10, -1, -1, -1, -1, -1, -1, -1},
{9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{9, 5, 4, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 5, 4, 1, 5, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{8, 5, 4, 8, 3, 5, 3, 1, 5, -1, -1, -1, -1, -1, -1, -1},
{1, 2, 10, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{3, 0, 8, 1, 2, 10, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1},
{5, 2, 10, 5, 4, 2, 4, 0, 2, -1, -1, -1, -1, -1, -1, -1},
{2, 10, 5, 3, 2, 5, 3, 5, 4, 3, 4, 8, -1, -1, -1, -1},
{9, 5, 4, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 11, 2, 0, 8, 11, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1},
{0, 5, 4, 0, 1, 5, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1},
{2, 1, 5, 2, 5, 8, 2, 8, 11, 4, 8, 5, -1, -1, -1, -1},
{10, 3, 11, 10, 1, 3, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1},
{4, 9, 5, 0, 8, 1, 8, 10, 1, 8, 11, 10, -1, -1, -1, -1},
{5, 4, 0, 5, 0, 11, 5, 11, 10, 11, 0, 3, -1, -1, -1, -1},
{5, 4, 8, 5, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1},
{9, 7, 8, 5, 7, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{9, 3, 0, 9, 5, 3, 5, 7, 3, -1, -1, -1, -1, -1, -1, -1},
{0, 7, 8, 0, 1, 7, 1, 5, 7, -1, -1, -1, -1, -1, -1, -1},
{1, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{9, 7, 8, 9, 5, 7, 10, 1, 2, -1, -1, -1, -1, -1, -1, -1},
{10, 1, 2, 9, 5, 0, 5, 3, 0, 5, 7, 3, -1, -1, -1, -1},
{8, 0, 2, 8, 2, 5, 8, 5, 7, 10, 5, 2, -1, -1, -1, -1},
{2, 10, 5, 2, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1},
{7, 9, 5, 7, 8, 9, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1},
{9, 5, 7, 9, 7, 2, 9, 2, 0, 2, 7, 11, -1, -1, -1, -1},
{2, 3, 11, 0, 1, 8, 1, 7, 8, 1, 5, 7, -1, -1, -1, -1},
{11, 2, 1, 11, 1, 7, 7, 1, 5, -1, -1, -1, -1, -1, -1, -1},
{9, 5, 8, 8, 5, 7, 10, 1, 3, 10, 3, 11, -1, -1, -1, -1},
{5, 7, 0, 5, 0, 9, 7, 11, 0, 1, 0, 10, 11, 10, 0, -1},
{11, 10, 0, 11, 0, 3, 10, 5, 0, 8, 0, 7, 5, 7, 0, -1},
{11, 10, 5, 7, 11, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 8, 3, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{9, 0, 1, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{1, 8, 3, 1, 9, 8, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1},
{1, 6, 5, 2, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{1, 6, 5, 1, 2, 6, 3, 0, 8, -1, -1, -1, -1, -1, -1, -1},
{9, 6, 5, 9, 0, 6, 0, 2, 6, -1, -1, -1, -1, -1, -1, -1},
{5, 9, 8, 5, 8, 2, 5, 2, 6, 3, 2, 8, -1, -1, -1, -1},
{2, 3, 11, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{11, 0, 8, 11, 2, 0, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1},
{0, 1, 9, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1},
{5, 10, 6, 1, 9, 2, 9, 11, 2, 9, 8, 11, -1, -1, -1, -1},
{6, 3, 11, 6, 5, 3, 5, 1, 3, -1, -1, -1, -1, -1, -1, -1},
{0, 8, 11, 0, 11, 5, 0, 5, 1, 5, 11, 6, -1, -1, -1, -1},
{3, 11, 6, 0, 3, 6, 0, 6, 5, 0, 5, 9, -1, -1, -1, -1},
{6, 5, 9, 6, 9, 11, 11, 9, 8, -1, -1, -1, -1, -1, -1, -1},
{5, 10, 6, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{4, 3, 0, 4, 7, 3, 6, 5, 10, -1, -1, -1, -1, -1, -1, -1},
{1, 9, 0, 5, 10, 6, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1},
{10, 6, 5, 1, 9, 7, 1, 7, 3, 7, 9, 4, -1, -1, -1, -1},
{6, 1, 2, 6, 5, 1, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1},
{1, 2, 5, 5, 2, 6, 3, 0, 4, 3, 4, 7, -1, -1, -1, -1},
{8, 4, 7, 9, 0, 5, 0, 6, 5, 0, 2, 6, -1, -1, -1, -1},
{7, 3, 9, 7, 9, 4, 3, 2, 9, 5, 9, 6, 2, 6, 9, -1},
{3, 11, 2, 7, 8, 4, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1},
{5, 10, 6, 4, 7, 2, 4, 2, 0, 2, 7, 11, -1, -1, -1, -1},
{0, 1, 9, 4, 7, 8, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1},
{9, 2, 1, 9, 11, 2, 9, 4, 11, 7, 11, 4, 5, 10, 6, -1},
{8, 4, 7, 3, 11, 5, 3, 5, 1, 5, 11, 6, -1, -1, -1, -1},
{5, 1, 11, 5, 11, 6, 1, 0, 11, 7, 11, 4, 0, 4, 11, -1},
{0, 5, 9, 0, 6, 5, 0, 3, 6, 11, 6, 3, 8, 4, 7, -1},
{6, 5, 9, 6, 9, 11, 4, 7, 9, 7, 11, 9, -1, -1, -1, -1},
{10, 4, 9, 6, 4, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{4, 10, 6, 4, 9, 10, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1},
{10, 0, 1, 10, 6, 0, 6, 4, 0, -1, -1, -1, -1, -1, -1, -1},
{8, 3, 1, 8, 1, 6, 8, 6, 4, 6, 1, 10, -1, -1, -1, -1},
{1, 4, 9, 1, 2, 4, 2, 6, 4, -1, -1, -1, -1, -1, -1, -1},
{3, 0, 8, 1, 2, 9, 2, 4, 9, 2, 6, 4, -1, -1, -1, -1},
{0, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{8, 3, 2, 8, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1},
{10, 4, 9, 10, 6, 4, 11, 2, 3, -1, -1, -1, -1, -1, -1, -1},
{0, 8, 2, 2, 8, 11, 4, 9, 10, 4, 10, 6, -1, -1, -1, -1},
{3, 11, 2, 0, 1, 6, 0, 6, 4, 6, 1, 10, -1, -1, -1, -1},
{6, 4, 1, 6, 1, 10, 4, 8, 1, 2, 1, 11, 8, 11, 1, -1},
{9, 6, 4, 9, 3, 6, 9, 1, 3, 11, 6, 3, -1, -1, -1, -1},
{8, 11, 1, 8, 1, 0, 11, 6, 1, 9, 1, 4, 6, 4, 1, -1},
{3, 11, 6, 3, 6, 0, 0, 6, 4, -1, -1, -1, -1, -1, -1, -1},
{6, 4, 8, 11, 6, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{7, 10, 6, 7, 8, 10, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1},
{0, 7, 3, 0, 10, 7, 0, 9, 10, 6, 7, 10, -1, -1, -1, -1},
{10, 6, 7, 1, 10, 7, 1, 7, 8, 1, 8, 0, -1, -1, -1, -1},
{10, 6, 7, 10, 7, 1, 1, 7, 3, -1, -1, -1, -1, -1, -1, -1},
{1, 2, 6, 1, 6, 8, 1, 8, 9, 8, 6, 7, -1, -1, -1, -1},
{2, 6, 9, 2, 9, 1, 6, 7, 9, 0, 9, 3, 7, 3, 9, -1},
{7, 8, 0, 7, 0, 6, 6, 0, 2, -1, -1, -1, -1, -1, -1, -1},
{7, 3, 2, 6, 7, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{2, 3, 11, 10, 6, 8, 10, 8, 9, 8, 6, 7, -1, -1, -1, -1},
{2, 0, 7, 2, 7, 11, 0, 9, 7, 6, 7, 10, 9, 10, 7, -1},
{1, 8, 0, 1, 7, 8, 1, 10, 7, 6, 7, 10, 2, 3, 11, -1},
{11, 2, 1, 11, 1, 7, 10, 6, 1, 6, 7, 1, -1, -1, -1, -1},
{8, 9, 6, 8, 6, 7, 9, 1, 6, 11, 6, 3, 1, 3, 6, -1},
{0, 9, 1, 11, 6, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{7, 8, 0, 7, 0, 6, 3, 11, 0, 11, 6, 0, -1, -1, -1, -1},
{7, 11, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{3, 0, 8, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 1, 9, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{8, 1, 9, 8, 3, 1, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1},
{10, 1, 2, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{1, 2, 10, 3, 0, 8, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1},
{2, 9, 0, 2, 10, 9, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1},
{6, 11, 7, 2, 10, 3, 10, 8, 3, 10, 9, 8, -1, -1, -1, -1},
{7, 2, 3, 6, 2, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{7, 0, 8, 7, 6, 0, 6, 2, 0, -1, -1, -1, -1, -1, -1, -1},
{2, 7, 6, 2, 3, 7, 0, 1, 9, -1, -1, -1, -1, -1, -1, -1},
{1, 6, 2, 1, 8, 6, 1, 9, 8, 8, 7, 6, -1, -1, -1, -1},
{10, 7, 6, 10, 1, 7, 1, 3, 7, -1, -1, -1, -1, -1, -1, -1},
{10, 7, 6, 1, 7, 10, 1, 8, 7, 1, 0, 8, -1, -1, -1, -1},
{0, 3, 7, 0, 7, 10, 0, 10, 9, 6, 10, 7, -1, -1, -1, -1},
{7, 6, 10, 7, 10, 8, 8, 10, 9, -1, -1, -1, -1, -1, -1, -1},
{6, 8, 4, 11, 8, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{3, 6, 11, 3, 0, 6, 0, 4, 6, -1, -1, -1, -1, -1, -1, -1},
{8, 6, 11, 8, 4, 6, 9, 0, 1, -1, -1, -1, -1, -1, -1, -1},
{9, 4, 6, 9, 6, 3, 9, 3, 1, 11, 3, 6, -1, -1, -1, -1},
{6, 8, 4, 6, 11, 8, 2, 10, 1, -1, -1, -1, -1, -1, -1, -1},
{1, 2, 10, 3, 0, 11, 0, 6, 11, 0, 4, 6, -1, -1, -1, -1},
{4, 11, 8, 4, 6, 11, 0, 2, 9, 2, 10, 9, -1, -1, -1, -1},
{10, 9, 3, 10, 3, 2, 9, 4, 3, 11, 3, 6, 4, 6, 3, -1},
{8, 2, 3, 8, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1},
{0, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{1, 9, 0, 2, 3, 4, 2, 4, 6, 4, 3, 8, -1, -1, -1, -1},
{1, 9, 4, 1, 4, 2, 2, 4, 6, -1, -1, -1, -1, -1, -1, -1},
{8, 1, 3, 8, 6, 1, 8, 4, 6, 6, 10, 1, -1, -1, -1, -1},
{10, 1, 0, 10, 0, 6, 6, 0, 4, -1, -1, -1, -1, -1, -1, -1},
{4, 6, 3, 4, 3, 8, 6, 10, 3, 0, 3, 9, 10, 9, 3, -1},
{10, 9, 4, 6, 10, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{4, 9, 5, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 8, 3, 4, 9, 5, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1},
{5, 0, 1, 5, 4, 0, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1},
{11, 7, 6, 8, 3, 4, 3, 5, 4, 3, 1, 5, -1, -1, -1, -1},
{9, 5, 4, 10, 1, 2, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1},
{6, 11, 7, 1, 2, 10, 0, 8, 3, 4, 9, 5, -1, -1, -1, -1},
{7, 6, 11, 5, 4, 10, 4, 2, 10, 4, 0, 2, -1, -1, -1, -1},
{3, 4, 8, 3, 5, 4, 3, 2, 5, 10, 5, 2, 11, 7, 6, -1},
{7, 2, 3, 7, 6, 2, 5, 4, 9, -1, -1, -1, -1, -1, -1, -1},
{9, 5, 4, 0, 8, 6, 0, 6, 2, 6, 8, 7, -1, -1, -1, -1},
{3, 6, 2, 3, 7, 6, 1, 5, 0, 5, 4, 0, -1, -1, -1, -1},
{6, 2, 8, 6, 8, 7, 2, 1, 8, 4, 8, 5, 1, 5, 8, -1},
{9, 5, 4, 10, 1, 6, 1, 7, 6, 1, 3, 7, -1, -1, -1, -1},
{1, 6, 10, 1, 7, 6, 1, 0, 7, 8, 7, 0, 9, 5, 4, -1},
{4, 0, 10, 4, 10, 5, 0, 3, 10, 6, 10, 7, 3, 7, 10, -1},
{7, 6, 10, 7, 10, 8, 5, 4, 10, 4, 8, 10, -1, -1, -1, -1},
{6, 9, 5, 6, 11, 9, 11, 8, 9, -1, -1, -1, -1, -1, -1, -1},
{3, 6, 11, 0, 6, 3, 0, 5, 6, 0, 9, 5, -1, -1, -1, -1},
{0, 11, 8, 0, 5, 11, 0, 1, 5, 5, 6, 11, -1, -1, -1, -1},
{6, 11, 3, 6, 3, 5, 5, 3, 1, -1, -1, -1, -1, -1, -1, -1},
{1, 2, 10, 9, 5, 11, 9, 11, 8, 11, 5, 6, -1, -1, -1, -1},
{0, 11, 3, 0, 6, 11, 0, 9, 6, 5, 6, 9, 1, 2, 10, -1},
{11, 8, 5, 11, 5, 6, 8, 0, 5, 10, 5, 2, 0, 2, 5, -1},
{6, 11, 3, 6, 3, 5, 2, 10, 3, 10, 5, 3, -1, -1, -1, -1},
{5, 8, 9, 5, 2, 8, 5, 6, 2, 3, 8, 2, -1, -1, -1, -1},
{9, 5, 6, 9, 6, 0, 0, 6, 2, -1, -1, -1, -1, -1, -1, -1},
{1, 5, 8, 1, 8, 0, 5, 6, 8, 3, 8, 2, 6, 2, 8, -1},
{1, 5, 6, 2, 1, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{1, 3, 6, 1, 6, 10, 3, 8, 6, 5, 6, 9, 8, 9, 6, -1},
{10, 1, 0, 10, 0, 6, 9, 5, 0, 5, 6, 0, -1, -1, -1, -1},
{0, 3, 8, 5, 6, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{10, 5, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{11, 5, 10, 7, 5, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{11, 5, 10, 11, 7, 5, 8, 3, 0, -1, -1, -1, -1, -1, -1, -1},
{5, 11, 7, 5, 10, 11, 1, 9, 0, -1, -1, -1, -1, -1, -1, -1},
{10, 7, 5, 10, 11, 7, 9, 8, 1, 8, 3, 1, -1, -1, -1, -1},
{11, 1, 2, 11, 7, 1, 7, 5, 1, -1, -1, -1, -1, -1, -1, -1},
{0, 8, 3, 1, 2, 7, 1, 7, 5, 7, 2, 11, -1, -1, -1, -1},
{9, 7, 5, 9, 2, 7, 9, 0, 2, 2, 11, 7, -1, -1, -1, -1},
{7, 5, 2, 7, 2, 11, 5, 9, 2, 3, 2, 8, 9, 8, 2, -1},
{2, 5, 10, 2, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1},
{8, 2, 0, 8, 5, 2, 8, 7, 5, 10, 2, 5, -1, -1, -1, -1},
{9, 0, 1, 5, 10, 3, 5, 3, 7, 3, 10, 2, -1, -1, -1, -1},
{9, 8, 2, 9, 2, 1, 8, 7, 2, 10, 2, 5, 7, 5, 2, -1},
{1, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 8, 7, 0, 7, 1, 1, 7, 5, -1, -1, -1, -1, -1, -1, -1},
{9, 0, 3, 9, 3, 5, 5, 3, 7, -1, -1, -1, -1, -1, -1, -1},
{9, 8, 7, 5, 9, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{5, 8, 4, 5, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1},
{5, 0, 4, 5, 11, 0, 5, 10, 11, 11, 3, 0, -1, -1, -1, -1},
{0, 1, 9, 8, 4, 10, 8, 10, 11, 10, 4, 5, -1, -1, -1, -1},
{10, 11, 4, 10, 4, 5, 11, 3, 4, 9, 4, 1, 3, 1, 4, -1},
{2, 5, 1, 2, 8, 5, 2, 11, 8, 4, 5, 8, -1, -1, -1, -1},
{0, 4, 11, 0, 11, 3, 4, 5, 11, 2, 11, 1, 5, 1, 11, -1},
{0, 2, 5, 0, 5, 9, 2, 11, 5, 4, 5, 8, 11, 8, 5, -1},
{9, 4, 5, 2, 11, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{2, 5, 10, 3, 5, 2, 3, 4, 5, 3, 8, 4, -1, -1, -1, -1},
{5, 10, 2, 5, 2, 4, 4, 2, 0, -1, -1, -1, -1, -1, -1, -1},
{3, 10, 2, 3, 5, 10, 3, 8, 5, 4, 5, 8, 0, 1, 9, -1},
{5, 10, 2, 5, 2, 4, 1, 9, 2, 9, 4, 2, -1, -1, -1, -1},
{8, 4, 5, 8, 5, 3, 3, 5, 1, -1, -1, -1, -1, -1, -1, -1},
{0, 4, 5, 1, 0, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{8, 4, 5, 8, 5, 3, 9, 0, 5, 0, 3, 5, -1, -1, -1, -1},
{9, 4, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{4, 11, 7, 4, 9, 11, 9, 10, 11, -1, -1, -1, -1, -1, -1, -1},
{0, 8, 3, 4, 9, 7, 9, 11, 7, 9, 10, 11, -1, -1, -1, -1},
{1, 10, 11, 1, 11, 4, 1, 4, 0, 7, 4, 11, -1, -1, -1, -1},
{3, 1, 4, 3, 4, 8, 1, 10, 4, 7, 4, 11, 10, 11, 4, -1},
{4, 11, 7, 9, 11, 4, 9, 2, 11, 9, 1, 2, -1, -1, -1, -1},
{9, 7, 4, 9, 11, 7, 9, 1, 11, 2, 11, 1, 0, 8, 3, -1},
{11, 7, 4, 11, 4, 2, 2, 4, 0, -1, -1, -1, -1, -1, -1, -1},
{11, 7, 4, 11, 4, 2, 8, 3, 4, 3, 2, 4, -1, -1, -1, -1},
{2, 9, 10, 2, 7, 9, 2, 3, 7, 7, 4, 9, -1, -1, -1, -1},
{9, 10, 7, 9, 7, 4, 10, 2, 7, 8, 7, 0, 2, 0, 7, -1},
{3, 7, 10, 3, 10, 2, 7, 4, 10, 1, 10, 0, 4, 0, 10, -1},
{1, 10, 2, 8, 7, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{4, 9, 1, 4, 1, 7, 7, 1, 3, -1, -1, -1, -1, -1, -1, -1},
{4, 9, 1, 4, 1, 7, 0, 8, 1, 8, 7, 1, -1, -1, -1, -1},
{4, 0, 3, 7, 4, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{4, 8, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{9, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{3, 0, 9, 3, 9, 11, 11, 9, 10, -1, -1, -1, -1, -1, -1, -1},
{0, 1, 10, 0, 10, 8, 8, 10, 11, -1, -1, -1, -1, -1, -1, -1},
{3, 1, 10, 11, 3, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{1, 2, 11, 1, 11, 9, 9, 11, 8, -1, -1, -1, -1, -1, -1, -1},
{3, 0, 9, 3, 9, 11, 1, 2, 9, 2, 11, 9, -1, -1, -1, -1},
{0, 2, 11, 8, 0, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{3, 2, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{2, 3, 8, 2, 8, 10, 10, 8, 9, -1, -1, -1, -1, -1, -1, -1},
{9, 10, 2, 0, 9, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{2, 3, 8, 2, 8, 10, 0, 1, 8, 1, 10, 8, -1, -1, -1, -1},
{1, 10, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{1, 3, 8, 9, 1, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 9, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 3, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}};
};

struct VS_INPUT
{
float4 Index1 : POSITION;
float4 Index2 : COLOR;
};

struct VS_OUPUT
{
float VertexIndex[8] : INDEX; // cube index
};

struct GS_OUTPUT
{
float4 Position : SV_POSITION; // vertex position
float4 Color : COLOR0; // color
};

struct SurfaceVertex
{
float4 Position;
float3 Normal;
};

//Estimate where isosurface intersects grid edge with endpoints v0, v1
SurfaceVertex CalcIntersection(float4 v0, float4 nf0, float4 v1, float4 nf1)
{
SurfaceVertex p;

float t = (isolevel - nf0.w) / (nf1.w - nf0.w);
p.Position = lerp(v0, v1, t);
p.Normal = lerp(nf0.xyz, nf1.xyz, t);

return p;
}

VS_OUPUT VSmain( VS_INPUT input )
{
VS_OUPUT output = (VS_OUPUT)0;

[unroll]
for(int i=0;i<4;i++)
{
output.VertexIndex[i] = input.Index1[i];
output.VertexIndex[i+4] = input.Index2[i];
}
return output;
}

//15 vertices are the maximum number that needs to be created, since it can be at most 5 triangles (5*3 = 15).
[maxvertexcount(15)]
void GSmain( point VS_OUPUT input[1], inout TriangleStream<GS_OUTPUT> Stream )
{
uint cubeindex = 0;
[unroll] //Avoids flow-control constructs.
for(int i = 7; i > -1; i--)
{
//construct bit field with a bit set for every vertex inside surfaceindex
//for example 1111 1111 = 255 etc.
cubeindex |= (uint(VertexBuffer.Load( input[0].VertexIndex[i]*2+1 ).w < isolevel) << i);
}

SurfaceVertex vertlist[12];
if(edgeTable[cubeindex] != 0x0)
{
//12-bits number, where 1-bit equals an edge.
//THIS Stopped working when I downloaded the new SDK
/*if (edgeTable[cubeindex] & 1)
vertlist[0] = CalcIntersection(VertexBuffer.Load( input[0].VertexIndex[0]*2 ), VertexBuffer.Load( input[0].VertexIndex[0]*2+1 ),
VertexBuffer.Load( input[0].VertexIndex[1]*2 ), VertexBuffer.Load( input[0].VertexIndex[1]*2+1 ));
if (edgeTable[cubeindex] & 2)
vertlist[1] = CalcIntersection(VertexBuffer.Load( input[0].VertexIndex[1]*2 ), VertexBuffer.Load( input[0].VertexIndex[1]*2+1 ),
VertexBuffer.Load( input[0].VertexIndex[2]*2 ), VertexBuffer.Load( input[0].VertexIndex[2]*2+1 ));
if (edgeTable[cubeindex] & 4)
vertlist[2] = CalcIntersection(VertexBuffer.Load( input[0].VertexIndex[2]*2 ), VertexBuffer.Load( input[0].VertexIndex[2]*2+1 ),
VertexBuffer.Load( input[0].VertexIndex[3]*2 ), VertexBuffer.Load( input[0].VertexIndex[3]*2+1 ));
if (edgeTable[cubeindex] & 8)
vertlist[3] = CalcIntersection(VertexBuffer.Load( input[0].VertexIndex[3]*2 ), VertexBuffer.Load( input[0].VertexIndex[3]*2+1 ),
VertexBuffer.Load( input[0].VertexIndex[0]*2 ), VertexBuffer.Load( input[0].VertexIndex[0]*2+1 ));
if (edgeTable[cubeindex] & 16)
vertlist[4] = CalcIntersection(VertexBuffer.Load( input[0].VertexIndex[4]*2 ), VertexBuffer.Load( input[0].VertexIndex[4]*2+1 ),
VertexBuffer.Load( input[0].VertexIndex[5]*2 ), VertexBuffer.Load( input[0].VertexIndex[5]*2+1 ));
if (edgeTable[cubeindex] & 32)
vertlist[5] = CalcIntersection(VertexBuffer.Load( input[0].VertexIndex[5]*2 ), VertexBuffer.Load( input[0].VertexIndex[5]*2+1 ),
VertexBuffer.Load( input[0].VertexIndex[6]*2 ), VertexBuffer.Load( input[0].VertexIndex[6]*2+1 ));
if (edgeTable[cubeindex] & 64)
vertlist[6] = CalcIntersection(VertexBuffer.Load( input[0].VertexIndex[6]*2 ), VertexBuffer.Load( input[0].VertexIndex[6]*2+1 ),
VertexBuffer.Load( input[0].VertexIndex[7]*2 ), VertexBuffer.Load( input[0].VertexIndex[7]*2+1 ));
if (edgeTable[cubeindex] & 128)
vertlist[7] = CalcIntersection(VertexBuffer.Load( input[0].VertexIndex[7]*2 ), VertexBuffer.Load( input[0].VertexIndex[7]*2+1 ),
VertexBuffer.Load( input[0].VertexIndex[4]*2 ), VertexBuffer.Load( input[0].VertexIndex[4]*2+1 ));
if (edgeTable[cubeindex] & 256)
vertlist[8] = CalcIntersection(VertexBuffer.Load( input[0].VertexIndex[0]*2 ), VertexBuffer.Load( input[0].VertexIndex[0]*2+1 ),
VertexBuffer.Load( input[0].VertexIndex[4]*2 ), VertexBuffer.Load( input[0].VertexIndex[4]*2+1 ));
if (edgeTable[cubeindex] & 512)
vertlist[9] = CalcIntersection(VertexBuffer.Load( input[0].VertexIndex[1]*2 ), VertexBuffer.Load( input[0].VertexIndex[1]*2+1 ),
VertexBuffer.Load( input[0].VertexIndex[5]*2 ), VertexBuffer.Load( input[0].VertexIndex[5]*2+1 ));
if (edgeTable[cubeindex] & 1024)
vertlist[10] = CalcIntersection(VertexBuffer.Load( input[0].VertexIndex[2]*2 ), VertexBuffer.Load( input[0].VertexIndex[2]*2+1 ),
VertexBuffer.Load( input[0].VertexIndex[6]*2 ), VertexBuffer.Load( input[0].VertexIndex[6]*2+1 ));
if (edgeTable[cubeindex] & 2048)
vertlist[11] = CalcIntersection(VertexBuffer.Load( input[0].VertexIndex[3]*2 ), VertexBuffer.Load( input[0].VertexIndex[3]*2+1 ),
VertexBuffer.Load( input[0].VertexIndex[7]*2 ), VertexBuffer.Load( input[0].VertexIndex[7]*2+1 )); */


//THIS WORKS after I downloaded the new SDK
float4 buffer1 = VertexBuffer.Load( input[0].VertexIndex[0]*2);
float4 buffer2 = VertexBuffer.Load( input[0].VertexIndex[0]*2+1);
float4 buffer3 = VertexBuffer.Load( input[0].VertexIndex[1]*2);
float4 buffer4 = VertexBuffer.Load(input[0].VertexIndex[1]*2+1);
if (edgeTable[cubeindex] & 1)
vertlist[0] = CalcIntersection(buffer1, buffer2,
buffer3, buffer4);

buffer1 = VertexBuffer.Load( input[0].VertexIndex[1]*2);
buffer2 = VertexBuffer.Load( input[0].VertexIndex[1]*2+1 );
buffer3 = VertexBuffer.Load( input[0].VertexIndex[2]*2 );
buffer4 = VertexBuffer.Load( input[0].VertexIndex[2]*2+1 );
if (edgeTable[cubeindex] & 2)
vertlist[1] = CalcIntersection(buffer1, buffer2,
buffer3, buffer4);

buffer1 = VertexBuffer.Load( input[0].VertexIndex[2]*2 );
buffer2 = VertexBuffer.Load( input[0].VertexIndex[2]*2+1 );
buffer3 = VertexBuffer.Load( input[0].VertexIndex[3]*2 );
buffer4 = VertexBuffer.Load( input[0].VertexIndex[3]*2+1 );
if (edgeTable[cubeindex] & 4)
vertlist[2] = CalcIntersection(buffer1, buffer2,
buffer3, buffer4);

buffer1 = VertexBuffer.Load( input[0].VertexIndex[3]*2 );
buffer2 = VertexBuffer.Load( input[0].VertexIndex[3]*2+1 );
buffer3 = VertexBuffer.Load( input[0].VertexIndex[0]*2 );
buffer4 = VertexBuffer.Load( input[0].VertexIndex[0]*2+1 );
if (edgeTable[cubeindex] & 8)
vertlist[3] = CalcIntersection(buffer1, buffer2,
buffer3, buffer4);

buffer1 = VertexBuffer.Load( input[0].VertexIndex[4]*2 );
buffer2 = VertexBuffer.Load( input[0].VertexIndex[4]*2+1 );
buffer3 = VertexBuffer.Load( input[0].VertexIndex[5]*2 );
buffer4 = VertexBuffer.Load( input[0].VertexIndex[5]*2+1 );
if (edgeTable[cubeindex] & 16)
vertlist[4] = CalcIntersection(buffer1, buffer2,
buffer3, buffer4);

buffer1 = VertexBuffer.Load( input[0].VertexIndex[5]*2 );
buffer2 = VertexBuffer.Load( input[0].VertexIndex[5]*2+1 );
buffer3 = VertexBuffer.Load( input[0].VertexIndex[6]*2 );
buffer4 = VertexBuffer.Load( input[0].VertexIndex[6]*2+1 );
if (edgeTable[cubeindex] & 32)
vertlist[5] = CalcIntersection(buffer1, buffer2,
buffer3, buffer4);

buffer1 = VertexBuffer.Load( input[0].VertexIndex[6]*2 );
buffer2 = VertexBuffer.Load( input[0].VertexIndex[6]*2+1 );
buffer3 = VertexBuffer.Load( input[0].VertexIndex[7]*2 );
buffer4 = VertexBuffer.Load( input[0].VertexIndex[7]*2+1 );
if (edgeTable[cubeindex] & 64)
vertlist[6] = CalcIntersection(buffer1, buffer2,
buffer3, buffer4);

buffer1 = VertexBuffer.Load( input[0].VertexIndex[7]*2 );
buffer2 = VertexBuffer.Load( input[0].VertexIndex[7]*2+1 );
buffer3 = VertexBuffer.Load( input[0].VertexIndex[4]*2 );
buffer4 = VertexBuffer.Load( input[0].VertexIndex[4]*2+1 );
if (edgeTable[cubeindex] & 128)
vertlist[7] = CalcIntersection(buffer1, buffer2,
buffer3, buffer4);

buffer1 = VertexBuffer.Load( input[0].VertexIndex[0]*2 );
buffer2 = VertexBuffer.Load( input[0].VertexIndex[0]*2+1 );
buffer3 = VertexBuffer.Load( input[0].VertexIndex[4]*2 );
buffer4 = VertexBuffer.Load( input[0].VertexIndex[4]*2+1 );
if (edgeTable[cubeindex] & 256)
vertlist[8] = CalcIntersection(buffer1, buffer2,
buffer3, buffer4);

buffer1 = VertexBuffer.Load( input[0].VertexIndex[1]*2 );
buffer2 = VertexBuffer.Load( input[0].VertexIndex[1]*2+1 );
buffer3 = VertexBuffer.Load( input[0].VertexIndex[5]*2 );
buffer4 = VertexBuffer.Load( input[0].VertexIndex[5]*2+1 );
if (edgeTable[cubeindex] & 512)
vertlist[9] = CalcIntersection(buffer1, buffer2,
buffer3, buffer4);

buffer1 = VertexBuffer.Load( input[0].VertexIndex[2]*2 );
buffer2 = VertexBuffer.Load( input[0].VertexIndex[2]*2+1 );
buffer3 = VertexBuffer.Load( input[0].VertexIndex[6]*2 );
buffer4 = VertexBuffer.Load( input[0].VertexIndex[6]*2+1 );
if (edgeTable[cubeindex] & 1024)
vertlist[10] = CalcIntersection(buffer1, buffer2,
buffer3, buffer4);

buffer1 = VertexBuffer.Load( input[0].VertexIndex[3]*2 );
buffer2 = VertexBuffer.Load( input[0].VertexIndex[3]*2+1 );
buffer3 = VertexBuffer.Load( input[0].VertexIndex[7]*2 );
buffer4 = VertexBuffer.Load( input[0].VertexIndex[7]*2+1 );
if (edgeTable[cubeindex] & 2048)
vertlist[11] = CalcIntersection(buffer1, buffer2,
buffer3, buffer4);

GS_OUTPUT output;
for(int i = 0; triTable[cubeindex][i] != -1; i += 3)
{
output.Color = float4(vertlist[triTable[cubeindex][i+2]].Normal, 1.0);
output.Position = vertlist[triTable[cubeindex][i+2]].Position;
Stream.Append( output ); //error X4580: emitting a system-interpreted value which is not written in every execution path of the shader

output.Color = float4(vertlist[triTable[cubeindex][i+1]].Normal, 1.0);
output.Position = vertlist[triTable[cubeindex][i+1]].Position;
Stream.Append( output );

output.Color = float4(vertlist[triTable[cubeindex][i]].Normal, 1.0);
output.Position = vertlist[triTable[cubeindex][i]].Position;
Stream.Append( output );
Stream.RestartStrip();
}
}
}

float4 PSmain(GS_OUTPUT input) : SV_TARGET
{
return input.Color;
}




[Edited by - noxic on November 8, 2009 10:01:35 AM]

Share this post


Link to post
Share on other sites
vertlist is only written inside conditional statements so I think you need to initialize it at the beginning to all zeros or something to make the compiler happy. I knows that it could happen where all conditionals are false (though I understand that in your algorithm, that should never happen, it however doesn't know that). Vertlist ultimately is written to the SV_Position output, so you'll always need to ensure that all 4 components are initialized.

Share this post


Link to post
Share on other sites
You're right DieterVW. Thank you for your advice! I now initialize both vertlist and all four buffer variables outside the conditional statement.

Now it looks like this.


SurfaceVertex vertlist[12];
for(int i = 0; i <= 11; i++)
{
vertlist[i].Normal = float3(0.0f, 0.0f, 0.0f);
vertlist[i].Position = float4(0.0f, 0.0f, 0.0f, 0.0f);
}
float4 buffer1 = float4(0.0f, 0.0f, 0.0f, 0.0f);
float4 buffer2 = float4(0.0f, 0.0f, 0.0f, 0.0f);
float4 buffer3 = float4(0.0f, 0.0f, 0.0f, 0.0f);
float4 buffer4 = float4(0.0f, 0.0f, 0.0f, 0.0f);
if(edgeTable[cubeindex] != 0x0)
{
.
.
.
}



However, that doesn't help to solve the problem.
What I think is wired, is that I don't get the error if I have it like this.
The index numbers are just random (though of course only numbers that are valid for the vertlist array)

Example that works (Not acceptable though, but I doesn't get the error):


GS_OUTPUT output;
for(int i = 0; triTable[cubeindex][i] != -1; i += 3)
{
output.Color = float4(vertlist[triTable[cubeindex][i+2]].Normal, 1.0);
output.Position = vertlist[1].Position; //index 1
Stream.Append( output );

output.Color = float4(vertlist[triTable[cubeindex][i+1]].Normal, 1.0);
output.Position = vertlist[1].Position; //index 1
Stream.Append( output );

output.Color = float4(vertlist[triTable[cubeindex][i]].Normal, 1.0);
output.Position = vertlist[1].Position; //index 1
Stream.Append( output );
Stream.RestartStrip();
}



I can't use neither "cubeindex" or "i" in verlist[triTable[cubeindex][i]].Position.
Tried to do it like this:

int temp = triTable[cubeindex][i];
output.Position = vertlist[temp].Position;

and a lot more. Haven't come up with anything that works though.

This is how I wanna have it, but that gives "error X4580: emitting a system-interpreted value which is not written in every execution path of the shader":


GS_OUTPUT output;
for(int i = 0; triTable[cubeindex][i] != -1; i += 3)
{
output.Color = float4(vertlist[triTable[cubeindex][i+2]].Normal, 1.0);
output.Position = vertlist[triTable[cubeindex][i+2]].Position;//error
Stream.Append( output );

output.Color = float4(vertlist[triTable[cubeindex][i+1]].Normal, 1.0);
output.Position = vertlist[triTable[cubeindex][i+1]].Position;//error
Stream.Append( output );

output.Color = float4(vertlist[triTable[cubeindex][i]].Normal, 1.0);
output.Position = vertlist[triTable[cubeindex][i]].Position;//error
Stream.Append( output );
Stream.RestartStrip();
}



"output.Color = float4(vertlist[triTable[cubeindex][i]].Normal" works whether I use "cubeindex" and "i" or for example "3" as index. Since the error message says "system-interpreted value", it's obviously something wrong with "SV_POSITION" i.e. vertlist[...].Position.
I hope someone will be able to help me with this problem.

Share this post


Link to post
Share on other sites
I still haven't figure the problem out, so I'm trying again. If you need more info, I'll fix that.

This works:


for(int j = 0; j <= 11; j++)
{
.
.
.

output.Position = vertlist[j].Position; //using j as index.
Stream.Append( output );

.
.
.
}



This doesn't work:


for(int k = 0; triTable[cubeindex][k] != -1; k += 3)
{
.
.
.

output.Position = vertlist[triTable[cubeindex][k]].Position;
Stream.Append( output ); //error X4580: emitting a system-interpreted value which is not written in every execution path of the shader

.
.
.
}

The for-loops are different, yes, but I don't get it. triTable[cubeindex][k] will return an int from -1 to 11, so shouldn't be a problem. I can't come up with any solution really :/
Thanks a lot in advance! Any help will be appreciated!

Share this post


Link to post
Share on other sites
I don't have any experience in this field, but try >= 0 instead of != -1 or something, that will make the compiler know that it will always be a valid index in the correct range.

Share this post


Link to post
Share on other sites
Thanks Erik Rufelt! That's better than ' != -1 '. It doesn't help me to solve the problem though.
I think it's something with cubeindex, since I can now use 'k' as an index.

I can for example have it like this:


GS_OUTPUT output;
for(int k = 0; triTable[cubeindex][k] >= 0; k += 3)
{
uint temp = 1;
output.Position = vertlist[triTable[temp][k+2]].Position; //this works, and I can remove temp and put for example '1' directly.
Stream.Append( output );
}



This doesn't work:


GS_OUTPUT output;
for(int k = 0; triTable[cubeindex][k] >= 0; k += 3)
{
int temp = 1;
output.Position = vertlist[triTable[cubeindex][k+2]].Position; //with cubeindex, it doesn't work.
Stream.Append( output );
}



Must be something wrong when I construct the bit field that the compiler doesn't like, or something else :/ Atleast it seems I can't use it as an array index. Since I can't use 'cubeindex' as an array index, it might be somethiing with this code I think.

cubeindex code:


uint cubeindex = 0;
[unroll] //Avoids flow-control constructs.
for(int i = 7; i > -1; i--)
{
//construct bit field with a bit set for every vertex inside surfaceindex
//for example 1111 1111 = 255 etc.
cubeindex |= (uint(VertexBuffer.Load( input[0].VertexIndex[i]*2+1 ).w < isolevel) << i);
}



Feels like I've tried so many things though, but nothing helps. Will continue testing ;>

Share this post


Link to post
Share on other sites
I've already tried that, and it doesn't work :/ Thanks for the tip though!

I just tried this so I could exclude that something is wrong with cubeindex when I construct the bit field:


uint sum = 0;
[unroll]
for(int i = 7; i >= 0; i--)
{

if(i == 7 && VertexBuffer.Load( input[0].VertexIndex[i]*2+1 ).w < isolevel)
sum += 128;
if(i == 6 && VertexBuffer.Load( input[0].VertexIndex[i]*2+1 ).w < isolevel)
sum += 64;
if(i == 5 && VertexBuffer.Load( input[0].VertexIndex[i]*2+1 ).w < isolevel)
sum += 32;
if(i == 4 && VertexBuffer.Load( input[0].VertexIndex[i]*2+1 ).w < isolevel)
sum += 16;
if(i == 3 && VertexBuffer.Load( input[0].VertexIndex[i]*2+1 ).w < isolevel)
sum += 8;
if(i == 2 && VertexBuffer.Load( input[0].VertexIndex[i]*2+1 ).w < isolevel)
sum += 4;
if(i == 1 && VertexBuffer.Load( input[0].VertexIndex[i]*2+1 ).w < isolevel)
sum += 2;
if(i == 0 && VertexBuffer.Load( input[0].VertexIndex[i]*2+1 ).w < isolevel)
sum += 1;
//cubeindex |= (uint(VertexBuffer.Load( input[0].VertexIndex[i]*2+1 ).w < isolevel) << i);
}



Then I use sum instead of cubeindex when I stream out. But I can't have it like this either. I can't use neither 'isolevel', nor 'VertexBuffer.Load( input[0].VertexIndex[i]*2+1 ).w' in a conditional statement it seem.

If I only have it like this, I don't get the error:

[source}
if(i == 7)
sum += 128;
.
.
.



So I have no idea what the problem is. Soon I don't know what more to test, since I've tried a lot of different approches.

Share this post


Link to post
Share on other sites
I'm afraid I have some bad news, or good.. depending on how you see it: I believe the compiler is dumb (or perhaps I am and don't understand something =)
Anyway, I believe there's a solution to your problem.
EDIT: First I thought you might make the array static, but I'm not sure that works though.. perhaps the shaders that run in parallel will share the static variable.. might not be a good idea. But default-initalizing the array might also work, as in the second working example below:


The following does not compile, with exactly that error you have:

struct GS_OUTPUT {
float4 Position : SV_Position;
};

[maxvertexcount(1)]
void GSmain(point uint input[1] : WHATEVER, inout TriangleStream<GS_OUTPUT> Stream) {
if(input[0] >= 0 && input[0] <= 1) {
float4 verts[2];
verts[0] = float4(1.0f, 1.0f, 1.0f, 1.0f);
verts[1] = float4(2.0f, 2.0f, 2.0f, 2.0f);

GS_OUTPUT output;
output.Position = verts[input[0]];
Stream.Append(output);
}
}


The following compiles fine:

[maxvertexcount(1)]
void GSmain(point uint input[1] : WHATEVER, inout TriangleStream<GS_OUTPUT> Stream) {
if(input[0] >= 0 && input[0] <= 1) {
static float4 verts[2];
verts[0] = float4(1.0f, 1.0f, 1.0f, 1.0f);
verts[1] = float4(2.0f, 2.0f, 2.0f, 2.0f);

GS_OUTPUT output;
output.Position = verts[input[0]];
Stream.Append(output);
}
}


The following also compiles fine:

[maxvertexcount(1)]
void GSmain(point uint input[1] : WHATEVER, inout TriangleStream<GS_OUTPUT> Stream) {
if(input[0] >= 0 && input[0] <= 1) {
float4 verts[2] = {
float4(0.0f, 0.0f, 0.0f, 0.0f),
float4(0.0f, 0.0f, 0.0f, 0.0f)
};
verts[0] = float4(1.0f, 1.0f, 1.0f, 1.0f);
verts[1] = float4(2.0f, 2.0f, 2.0f, 2.0f);

GS_OUTPUT output;
output.Position = verts[input[0]];
Stream.Append(output);
}
}


Like the compiler doesn't realize the array is completely filled in if it doesn't have default values..

Share this post


Link to post
Share on other sites
WoW!
Definitely good news! =)

metaballs

It works again!

Thank you so much Erik Rufelt, and everyone else that has tried to help me!

I just made 'verlist' static like you suggested, and it works =O


static SurfaceVertex vertlist[12];



I'm not sure if shaders that run in parallel will share static variables, but if they do, it's not a problem for this application.
Still I don't really know why making it static would letting me get rid of that error. Will try and investigate it^^

Thanks a lot guys!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this