//TEST_IGNORE_FILE: //-------------------------------------------------------------------------------------- // File: Tutorial13.fx // // Copyright (c) Microsoft Corporation. All rights reserved. //-------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------- // Constant Buffer Variables //-------------------------------------------------------------------------------------- Texture2D g_txDiffuse; SamplerState samLinear { Filter = MIN_MAG_MIP_LINEAR; AddressU = Wrap; AddressV = Wrap; }; TextureCube g_txEnvMap; SamplerState samLinearClamp { Filter = MIN_MAG_MIP_LINEAR; AddressU = Clamp; AddressV = Clamp; }; cbuffer cbConstant { float3 vLightDir = float3(-0.577,0.577,-0.577); }; cbuffer cbChangesEveryFrame { matrix World; matrix View; matrix Projection; float Time; }; cbuffer cbUserChanges { float Explode; }; struct VS_INPUT { float3 Pos : POSITION; float3 Norm : NORMAL; float2 Tex : TEXCOORD0; }; struct GSPS_INPUT { float4 Pos : SV_POSITION; float3 Norm : TEXCOORD0; float2 Tex : TEXCOORD1; }; //-------------------------------------------------------------------------------------- // DepthStates //-------------------------------------------------------------------------------------- DepthStencilState EnableDepth { DepthEnable = TRUE; DepthWriteMask = ALL; DepthFunc = LESS_EQUAL; }; BlendState NoBlending { AlphaToCoverageEnable = FALSE; BlendEnable[0] = FALSE; }; //-------------------------------------------------------------------------------------- // Vertex Shader //-------------------------------------------------------------------------------------- GSPS_INPUT VS( VS_INPUT input ) { GSPS_INPUT output = (GSPS_INPUT)0; output.Pos = mul( float4(input.Pos,1), World ); output.Norm = mul( input.Norm, (float3x3)World ); output.Tex = input.Tex; return output; } //-------------------------------------------------------------------------------------- // Geometry Shader //-------------------------------------------------------------------------------------- [maxvertexcount(12)] void GS( triangle GSPS_INPUT input[3], inout TriangleStream TriStream ) { GSPS_INPUT output; // // Calculate the face normal // float3 faceEdgeA = input[1].Pos - input[0].Pos; float3 faceEdgeB = input[2].Pos - input[0].Pos; float3 faceNormal = normalize( cross(faceEdgeA, faceEdgeB) ); float3 ExplodeAmt = faceNormal*Explode; // // Calculate the face center // float3 centerPos = (input[0].Pos.xyz + input[1].Pos.xyz + input[2].Pos.xyz)/3.0; float2 centerTex = (input[0].Tex + input[1].Tex + input[2].Tex)/3.0; centerPos += faceNormal*Explode; // // Output the pyramid // for( int i=0; i<3; i++ ) { output.Pos = input[i].Pos + float4(ExplodeAmt,0); output.Pos = mul( output.Pos, View ); output.Pos = mul( output.Pos, Projection ); output.Norm = input[i].Norm; output.Tex = input[i].Tex; TriStream.Append( output ); int iNext = (i+1)%3; output.Pos = input[iNext].Pos + float4(ExplodeAmt,0); output.Pos = mul( output.Pos, View ); output.Pos = mul( output.Pos, Projection ); output.Norm = input[iNext].Norm; output.Tex = input[iNext].Tex; TriStream.Append( output ); output.Pos = float4(centerPos,1) + float4(ExplodeAmt,0); output.Pos = mul( output.Pos, View ); output.Pos = mul( output.Pos, Projection ); output.Norm = faceNormal; output.Tex = centerTex; TriStream.Append( output ); TriStream.RestartStrip(); } for( int i=2; i>=0; i-- ) { output.Pos = input[i].Pos + float4(ExplodeAmt,0); output.Pos = mul( output.Pos, View ); output.Pos = mul( output.Pos, Projection ); output.Norm = -input[i].Norm; output.Tex = input[i].Tex; TriStream.Append( output ); } TriStream.RestartStrip(); } //-------------------------------------------------------------------------------------- // Pixel Shader //-------------------------------------------------------------------------------------- float4 PS( GSPS_INPUT input) : SV_Target { // Calculate lighting assuming light color is <1,1,1,1> float fLighting = saturate( dot( input.Norm, vLightDir ) ); // Load the diffuse texture and multiply by the lighting amount float4 cDiffuse = g_txDiffuse.Sample( samLinear, input.Tex ) * fLighting; cDiffuse.a = 1; // return diffuse return cDiffuse; } //-------------------------------------------------------------------------------------- // Technique //-------------------------------------------------------------------------------------- technique11 Render { pass P0 { SetVertexShader( CompileShader( vs_4_0, VS() ) ); SetGeometryShader( CompileShader( gs_4_0, GS() ) ); SetPixelShader( CompileShader( ps_4_0, PS() ) ); SetBlendState( NoBlending, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF ); SetDepthStencilState( EnableDepth, 0 ); } }