ジオメトリシェーダーで点
ジオメトリシェーダーを使うために簡単なサンプルを作った。
3つ点があり、それぞれの点からさらに2つの点を作る。
シェーダーコード
struct VS_INPUT { float4 Pos : POSITION; }; struct GS_INPUT { float4 Pos : POSITION; }; typedef GS_INPUT VS_OUTPUT; struct PS_INPUT { float4 Pos : SV_POSITION; float4 Col : COLOR0; }; typedef PS_INPUT GS_OUTPUT; //-------------------------------------------------------------------------------------- // Vertex Shader //-------------------------------------------------------------------------------------- VS_OUTPUT VS( VS_INPUT input ) { VS_OUTPUT output = (VS_OUTPUT)0; output.Pos = input.Pos; return output; } //-------------------------------------------------------------------------------------- // Geometry Shader //-------------------------------------------------------------------------------------- [maxvertexcount(3)] void GS( point GS_INPUT input[1], inout PointStream<PS_INPUT> stream ) { GS_OUTPUT output = (GS_OUTPUT)0; output.Pos = input[0].Pos; output.Col = float4(1.0f, 0.0f, 0.0f, 1.0f); stream.Append(output); output.Pos = input[0].Pos + float4(0.1f, 0.0f, 0.0f, 0.0f); output.Col = float4(0.0f, 1.0f, 0.0f, 1.0f); stream.Append(output); output.Pos = input[0].Pos + float4(-0.1f, 0.0f, 0.0f, 0.0f); output.Col = float4(0.0f, 1.0f, 1.0f, 1.0f); stream.Append(output); stream.RestartStrip(); } //-------------------------------------------------------------------------------------- // Pixel Shader //-------------------------------------------------------------------------------------- float4 PS( PS_INPUT input ) : SV_Target { return input.Col; // Yellow, with Alpha = 1 }
ジオメトリシェーダの作成
// Compile the geometry shader ID3DBlob* pGSBlob = NULL; hr = CompileShaderFromFile( L"GS.fx", "GS", "gs_4_0", &pGSBlob ); if( FAILED( hr ) ) { MessageBox( NULL, L"The FX file cannot be compiled. Please run this executable from the directory that contains the FX file.", L"Error", MB_OK ); return hr; } // Create the geometry shader hr = g_pd3dDevice->CreateGeometryShader( pGSBlob->GetBufferPointer(), pGSBlob->GetBufferSize(), NULL, &g_pGeometryShader ); pGSBlob->Release(); if( FAILED( hr ) ) return hr;
ジオメトリシェーダの設定
g_pImmediateContext->VSSetShader( g_pVertexShader, NULL, 0 ); g_pImmediateContext->GSSetShader( g_pGeometryShader, NULL, 0 ); g_pImmediateContext->PSSetShader( g_pPixelShader, NULL, 0 ); g_pImmediateContext->Draw( 3, 0 );