bate's blog

調べたこと実装したことなどを取りとめもなく書きます。

ジオメトリシェーダーで点

ジオメトリシェーダーを使うために簡単なサンプルを作った。

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 );

3つの赤い点

緑と水色の点をジオメトリシェーダーで追加