aboutsummaryrefslogtreecommitdiff
path: root/demo/d3d11/shaders/ellipsoidDepthGS.hlsl
diff options
context:
space:
mode:
Diffstat (limited to 'demo/d3d11/shaders/ellipsoidDepthGS.hlsl')
-rw-r--r--demo/d3d11/shaders/ellipsoidDepthGS.hlsl127
1 files changed, 127 insertions, 0 deletions
diff --git a/demo/d3d11/shaders/ellipsoidDepthGS.hlsl b/demo/d3d11/shaders/ellipsoidDepthGS.hlsl
new file mode 100644
index 0000000..8c892e4
--- /dev/null
+++ b/demo/d3d11/shaders/ellipsoidDepthGS.hlsl
@@ -0,0 +1,127 @@
+#include "shaderCommon.h"
+
+cbuffer constBuf : register(b0)
+{
+ FluidShaderConst gParams;
+};
+
+static const float2 corners[4] =
+{
+ float2(0.0, 1.0), float2(0.0, 0.0), float2(1.0, 1.0), float2(1.0, 0.0)
+};
+
+[maxvertexcount(4)]
+void ellipsoidDepthGS(point FluidVertexOut input[1], inout TriangleStream<FluidGeoOut> triStream)
+{
+ float4 gl_Position;
+ float4 gl_TexCoord[6];
+
+ float4 gl_PositionIn[1];
+ float4 gl_TexCoordIn[1][6];
+
+ gl_PositionIn[0] = input[0].position;
+ {
+ [unroll]
+ for (int i = 0; i < 6; i++)
+ gl_TexCoordIn[0][i] = input[0].texCoord[i];
+ }
+
+ float3 pos = gl_PositionIn[0].xyz;
+ float4 bounds = gl_TexCoordIn[0][0];
+ float4 ndcPos = gl_TexCoordIn[0][5];
+
+ if (ndcPos.w < 0.0)
+ return;
+
+ // frustrum culling
+ const float ndcBound = 1.0;
+ if (ndcPos.x < -ndcBound) return;
+ if (ndcPos.x > ndcBound) return;
+ if (ndcPos.y < -ndcBound) return;
+ if (ndcPos.y > ndcBound) return;
+
+ float xmin = bounds.x;
+ float xmax = bounds.y;
+ float ymin = bounds.z;
+ float ymax = bounds.w;
+
+
+ // inv quadric transform
+ gl_TexCoord[0] = gl_TexCoordIn[0][1];
+ gl_TexCoord[1] = gl_TexCoordIn[0][2];
+ gl_TexCoord[2] = gl_TexCoordIn[0][3];
+ gl_TexCoord[3] = gl_TexCoordIn[0][4];
+
+ FluidGeoOut output;
+
+ gl_Position = float4(xmin, ymax, 0.5, 1.0);
+ output.position = gl_Position;
+ output.texCoord[0] = gl_TexCoord[0];
+ output.texCoord[1] = gl_TexCoord[1];
+ output.texCoord[2] = gl_TexCoord[2];
+ output.texCoord[3] = gl_TexCoord[3];
+ triStream.Append(output);
+
+ gl_Position = float4(xmin, ymin, 0.5, 1.0);
+ output.position = gl_Position;
+ output.texCoord[0] = gl_TexCoord[0];
+ output.texCoord[1] = gl_TexCoord[1];
+ output.texCoord[2] = gl_TexCoord[2];
+ output.texCoord[3] = gl_TexCoord[3];
+ triStream.Append(output);
+
+ gl_Position = float4(xmax, ymax, 0.5, 1.0);
+ output.position = gl_Position;
+ output.texCoord[0] = gl_TexCoord[0];
+ output.texCoord[1] = gl_TexCoord[1];
+ output.texCoord[2] = gl_TexCoord[2];
+ output.texCoord[3] = gl_TexCoord[3];
+ triStream.Append(output);
+
+ gl_Position = float4(xmax, ymin, 0.5, 1.0);
+ output.position = gl_Position;
+ output.texCoord[0] = gl_TexCoord[0];
+ output.texCoord[1] = gl_TexCoord[1];
+ output.texCoord[2] = gl_TexCoord[2];
+ output.texCoord[3] = gl_TexCoord[3];
+ triStream.Append(output);
+
+ /*
+ void main()
+ {
+ vec3 pos = gl_PositionIn[0].xyz;
+ vec4 bounds = gl_TexCoordIn[0][0];
+ vec4 ndcPos = gl_TexCoordIn[0][5];
+
+ // frustrum culling
+ const float ndcBound = 1.0;
+ if (ndcPos.x < -ndcBound) return;
+ if (ndcPos.x > ndcBound) return;
+ if (ndcPos.y < -ndcBound) return;
+ if (ndcPos.y > ndcBound) return;
+
+ float xmin = bounds.x;
+ float xmax = bounds.y;
+ float ymin = bounds.z;
+ float ymax = bounds.w;
+
+ // inv quadric transform
+ gl_TexCoord[0] = gl_TexCoordIn[0][1];
+ gl_TexCoord[1] = gl_TexCoordIn[0][2];
+ gl_TexCoord[2] = gl_TexCoordIn[0][3];
+ gl_TexCoord[3] = gl_TexCoordIn[0][4];
+
+ gl_Position = vec4(xmin, ymax, 0.0, 1.0);
+ EmitVertex();
+
+ gl_Position = vec4(xmin, ymin, 0.0, 1.0);
+ EmitVertex();
+
+ gl_Position = vec4(xmax, ymax, 0.0, 1.0);
+ EmitVertex();
+
+ gl_Position = vec4(xmax, ymin, 0.0, 1.0);
+ EmitVertex();
+ }
+ */
+}