DirectX11でピクセルシェーダの定数バッファが設定できない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
tettyA
記事: 6
登録日時: 2年前

DirectX11でピクセルシェーダの定数バッファが設定できない

#1

投稿記事 by tettyA » 2年前

DirectX11でピクセルシェーダの定数バッファを設定したいのですが、その値が反映されない(0.0fになってしまっている)て困っています。
また、一度更新してしまうとmpCBがNULLになってしまい、二度と更新出来なくなってしまうのですがそれも定数バッファの値が反映されないのと関係しているのでしょうか?

どのように改善すればDirectX11側から定数バッファの値を変更できるようになるのかが分かるのならば、ご教授お願いします。

参考にしたサイト
1
2

C++のバージョン:C++20
コンパイラ:VC++(Visual Studio2022)

頂点シェーダーのバージョン:vs_4_0
ピクセルシェーダーのバージョン:ps_4_0
コード(DirectX)

コード:

    //Graphic初期化
    ComPtr<ID3D11Device> m_device;
    ComPtr<ID3D11DeviceContext> m_devicecontext;
    //D3D11CreateDevice
    //CreateSwapChain
    //バックバッファリソース取得
    //-------略--------
    
    
    //----------------透過処理を有効にする------------------
    D3D11_BLEND_DESC BlendState = {};
    ID3D11BlendState* pBlendState;
    BlendState.AlphaToCoverageEnable = FALSE;
    BlendState.IndependentBlendEnable = FALSE;
    BlendState.RenderTarget[0].BlendEnable = TRUE;
    BlendState.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA;
    BlendState.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
    BlendState.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD;
    BlendState.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE;
    BlendState.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO;
    BlendState.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD;
    BlendState.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
    m_device->CreateBlendState(&BlendState, &pBlendState);
    FLOAT BlendFactor[4] = { 0.0f,0.0f,0.0f,0.0f };
    m_devicecontext->OMSetBlendState(pBlendState, BlendFactor, 0xffffffff);

    
    
    //頂点シェーダの読み込みandコンパイル(略)
    
    //PShaderPathにはピクセルシェーダへのパスが入っています。
   //ピクセルシェーダーの読み込みandコンパイル
    ComPtr<ID3DBlob>compiledPS;
    if (FAILED(D3DCompileFromFile(PShaderPath, nullptr, nullptr, "PS", "ps_4_0", 0, 0, &compiledPS, nullptr))) {
        return false;
    }
    
    //頂点シェーダの作成(略)
    
    //ピクセルシェーダの作成
    if (FAILED(m_device->CreatePixelShader(compiledPS->GetBufferPointer(), compiledPS->GetBufferSize(), nullptr, &m_spritePS))) {
        return false;
    }
    
    
    
    //頂点のインプットレイアウト作成
    //----------------略---------------
    
    //---------------定数バッファの設定-------------------
        ComPtr<ID3D11Buffer>mpCB;
    struct Param_CB {//パラメーター・Constant Buffer
        FLOAT cAlphaAtai = 0.0f;
        
    };
    //作成するID3D11Bufferの設定情報
    D3D11_BUFFER_DESC desc = {};
    desc.ByteWidth = sizeof(Param_CB) +(sizeof(Param_CB) % 16 == 0 ? 0 : 16 - (sizeof(Param_CB) % 16));//サイズは16の倍数でなければいけない。
    desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;//ID3D11BufferをConstant_Bufferとして使う
    desc.Usage = D3D11_USAGE_DEFAULT;//GPU上からしかID3D11Bufferの内容にアクセスできないよう宣言している
    desc.CPUAccessFlags = 0;
    desc.MiscFlags = 0;
    desc.StructureByteStride = 0;

    if (FAILED(m_device->CreateBuffer(&desc, NULL, &mpCB))) {
        return false;
    }
    
    //定数バッファの値の設定
    Param_CB p = {};
    p.cAlphaAtai = 0.5f;
    m_devicecontext->UpdateSubresource(mpCB.Get(), 0, NULL, &p, 0, 0);

    m_devicecontext->PSSetConstantBuffers(0, 1, &mpCB);

    
コード(ピクセルシェーダ)
*ピクセルシェーダと頂点シェーダは別々のファイルです。

コード:

Texture2D g_texture:register(t0);
SamplerState g_sampler:register(s0);

// 頂点シェーダーから出力するデータ
struct VSOutput
{
    float4 Pos : SV_POSITION;   // 頂点の座標(射影座標系)
    float2 UV  : TEXCORD0;      //UV座標
};

cbuffer AlphaAtai:register(b0) {
    float cAlphaAtai;
};


// ピクセルシェーダー
float4 PS(VSOutput In) : SV_Target0
{
    float4 texColor = g_texture.Sample(g_sampler,In.UV);
    texColor.a = cAlphaAtai;
    //上一行を
    //texColo.a=1.0f
    //にすると問題なく描画されます。(透過はされませんが)

    return texColor;
}

tettyA
記事: 6
登録日時: 2年前

追記

#2

投稿記事 by tettyA » 2年前

このサイトに同様の質問をさせていただきました。

参照魚
記事: 109
登録日時: 7年前

Re: DirectX11でピクセルシェーダの定数バッファが設定できない

#3

投稿記事 by 参照魚 » 2年前

cbufferのアライアメントで何かあるかもです。

コード:

cbuffer AlphaAtai:register(b0) {
    float cAlphaAtai;
};
float4にして試してみるとかありかもしれません。

tettyA
記事: 6
登録日時: 2年前

Re: DirectX11でピクセルシェーダの定数バッファが設定できない

#4

投稿記事 by tettyA » 2年前

float4に変えてみたところ、ピクセルシェーダのコンパイルは通りましたが、設定された値は反映されなかったです。

コード:


cbuffer AlphaAtai:register(b0) {
    float4 cAlphaAtai;
};


// ピクセルシェーダー
float4 PS(VSOutput In) : SV_Target0
{
    float4 texColor = g_texture.Sample(g_sampler,In.UV);
    texColor.a = cAlphaAtai.a;
    

    return texColor;
}

コード:

    struct Param_CB {//パラメーター・Constant Buffer
        DirectX::XMFLOAT4 col;
        //FLOAT cAlphaAtai = 0.0f;
        
    };
    //作成するID3D11Bufferの設定情報
    D3D11_BUFFER_DESC desc = {};
    desc.ByteWidth = sizeof(Param_CB) + (sizeof(Param_CB) % 16 == 0 ? 0 : 16 - (sizeof(Param_CB) % 16));//サイズは16の倍数でなければいけない。
    desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;//ID3D11BufferをConstant_Bufferとして使う
    desc.Usage = D3D11_USAGE_DEFAULT;//GPU上からしかID3D11Bufferの内容にアクセスできないよう宣言している
    desc.CPUAccessFlags = 0;
    desc.MiscFlags = 0;
    desc.StructureByteStride = 0;

    if (FAILED(m_device->CreateBuffer(&desc, NULL, &mpCB))) {
        return false;
    }
    Param_CB p = { {0.5f,0.5f,0.5f,0.5f} };//とりあえずこれで設定してみる
    m_devicecontext->UpdateSubresource(mpCB.Get(), 0, NULL, &p, 0, 0);


    m_devicecontext->PSSetConstantBuffers(0, 1, &mpCB);

参照魚
記事: 109
登録日時: 7年前

Re: DirectX11でピクセルシェーダの定数バッファが設定できない

#5

投稿記事 by 参照魚 » 2年前

ComPtrに詳しくないので未確認ですが、&mpCBだとComPtrインスタンス自身のアドレスを取ってしまうような気がします。ComPtrが保持しているID3DX11Bufferのポインターのポインターを取得するには専用のメソッドがあるようです。

m_devicecontext->PSSetConstantBuffers(0, 1, &mpCB);

m_devicecontext->PSSetConstantBuffers(0, 1, mpCB.GetAddressOf() );

tettyA
記事: 6
登録日時: 2年前

Re: DirectX11でピクセルシェーダの定数バッファが設定できない

#6

投稿記事 by tettyA » 2年前

ありがとうございます!!無事定数バッファに値を設定できました!!

返信

“C言語何でも質問掲示板” へ戻る