0

私はHLSLの完全な初心者であり、平らな三角形をレンダリングするサンプルコードをいくつか持っています。PShader関数を、明示的な色を返す関数から、以下のグローバル変数(mycol)を参照する関数に置き換えようとすると、三角形はカラーではなく黒でレンダリングされます。

float4 mycol = float4(1.0f, 1.0f, 0.0f, 1.0f);

float4 VShader(float4 position : POSITION) : SV_POSITION
{
        return position;
}

float4 PShader(float4 position : SV_POSITION) : SV_Target
{
    return mycol; // float4(1.0f, 0.0f, 1.0f, 1.0f);
}

HLSL仕様を読んでみましたが、おそらく明らかな何かが欠けていると感じますか?

助けていただければ幸いです、GMan

4

2 に答える 2

0

個別のシェーダーを使用している場合、グローバル変数の値が変更されている可能性があります...変数を転送してみてください:

float4 mycol = float4(1.0f, 1.0f, 0.0f, 1.0f);

struct VS_OUT
{
    float4 pos : SV_Position;
    float4 color : COLOR0;
}

VS_OUT VShader(float4 position : POSITION)
{
    VS_OUT ret;
    ret.pos = position;
    ret.color = mycol; // forward variable
    return ret; 
}

float4 PShader(VS_OUT input) : SV_Target
{
    return input.color;
}
于 2013-01-19T23:00:59.337 に答える
0

directx では、定数バッファーを使用してのみグローバル値を渡すことができると思います。C++ コードで定数バッファーを開始する必要があります。

    D3D11_BUFFER_DESC constDesc;
ZeroMemory( &constDesc, sizeof( constDesc ) );
constDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
constDesc.ByteWidth = sizeof(XMFLOAT4);
constDesc.Usage = D3D11_USAGE_DEFAULT;

d3dResult = d3dDevice_->CreateBuffer( &constDesc, 0, &shaderCB_ );

if( FAILED( d3dResult ) )
{
    return false;
}

次に、レンダリング コードで:

XMFLOAT4 mycol = XMFLOAT4(1,1,0,1);
d3dContext_->UpdateSubresource(shaderCB_, 0, 0, &mycol, 0, 0);

そしてあなたのシェーダーで:

cbuffer colorbuf : register(b0)
{
    float4 mycol;
};
于 2013-01-20T02:14:31.070 に答える