前書き
この質問はここのマルチポストです。両方ともマルチポストがOKでしたのでさせていただきました。
質問
DirectX11でピクセルシェーダの定数バッファを設定したいのですが、その値が反映されない(0.0fになってしまっている)て困っています。
また、一度更新してしまうとmpCBがNULLになってしまい、二度と更新出来なくなってしまうのですがそれも定数バッファの値が反映されないのと関係しているのでしょうか?
どのように改善すればDirectX11側から定数バッファの値を変更できるようになるのかが分かるのならば、ご教授お願いします。
参考にしたサイト
環境
C++のバージョン:C++20
コンパイラ:VC++(Visual Studio2022)
頂点シェーダーのバージョン:vs_4_0
ピクセルシェーダーのバージョン:ps_4_0
コード
コード(DirectX)
Cpp
1 //Graphic初期化 2 ComPtr<ID3D11Device> m_device; 3 ComPtr<ID3D11DeviceContext> m_devicecontext; 4 //D3D11CreateDevice 5 //CreateSwapChain 6 //バックバッファリソース取得 7 //-------略-------- 8 9 10 //----------------透過処理を有効にする------------------ 11 D3D11_BLEND_DESC BlendState = {}; 12 ID3D11BlendState* pBlendState; 13 BlendState.AlphaToCoverageEnable = FALSE; 14 BlendState.IndependentBlendEnable = FALSE; 15 BlendState.RenderTarget[0].BlendEnable = TRUE; 16 BlendState.RenderTarget[0].SrcBlend = D3D11_BLEND_SRC_ALPHA; 17 BlendState.RenderTarget[0].DestBlend = D3D11_BLEND_INV_SRC_ALPHA; 18 BlendState.RenderTarget[0].BlendOp = D3D11_BLEND_OP_ADD; 19 BlendState.RenderTarget[0].SrcBlendAlpha = D3D11_BLEND_ONE; 20 BlendState.RenderTarget[0].DestBlendAlpha = D3D11_BLEND_ZERO; 21 BlendState.RenderTarget[0].BlendOpAlpha = D3D11_BLEND_OP_ADD; 22 BlendState.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL; 23 m_device->CreateBlendState(&BlendState, &pBlendState); 24 FLOAT BlendFactor[4] = { 0.0f,0.0f,0.0f,0.0f }; 25 m_devicecontext->OMSetBlendState(pBlendState, BlendFactor, 0xffffffff); 26 27 28 29 //頂点シェーダの読み込みandコンパイル(略) 30 31 //PShaderPathにはピクセルシェーダへのパスが入っています。 32 //ピクセルシェーダーの読み込みandコンパイル 33 ComPtr<ID3DBlob>compiledPS; 34 if (FAILED(D3DCompileFromFile(PShaderPath, nullptr, nullptr, "PS", "ps_4_0", 0, 0, &compiledPS, nullptr))) { 35 return false; 36 } 37 38 //頂点シェーダの作成(略) 39 40 //ピクセルシェーダの作成 41 if (FAILED(m_device->CreatePixelShader(compiledPS->GetBufferPointer(), compiledPS->GetBufferSize(), nullptr, &m_spritePS))) { 42 return false; 43 } 44 45 46 47 //頂点のインプットレイアウト作成 48 //----------------略--------------- 49 50 //---------------定数バッファの設定------------------- 51 ComPtr<ID3D11Buffer>mpCB; 52 struct Param_CB {//パラメーター・Constant Buffer 53 FLOAT cAlphaAtai = 0.0f; 54 55 }; 56 //作成するID3D11Bufferの設定情報 57 D3D11_BUFFER_DESC desc = {}; 58 desc.ByteWidth = sizeof(Param_CB) +(sizeof(Param_CB) % 16 == 0 ? 0 : 16 - (sizeof(Param_CB) % 16));//サイズは16の倍数でなければいけない。 59 desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;//ID3D11BufferをConstant_Bufferとして使う 60 desc.Usage = D3D11_USAGE_DEFAULT;//GPU上からしかID3D11Bufferの内容にアクセスできないよう宣言している 61 desc.CPUAccessFlags = 0; 62 desc.MiscFlags = 0; 63 desc.StructureByteStride = 0; 64 65 if (FAILED(m_device->CreateBuffer(&desc, NULL, &mpCB))) { 66 return false; 67 } 68 69 //定数バッファの値の設定 70 Param_CB p = {}; 71 p.cAlphaAtai = 0.5f; 72 m_devicecontext->UpdateSubresource(mpCB.Get(), 0, NULL, &p, 0, 0); 73 74 m_devicecontext->PSSetConstantBuffers(0, 1, &mpCB); 75 76
コード(ピクセルシェーダ)
*ピクセルシェーダと頂点シェーダは別々のファイルです。
Cpp
1Texture2D g_texture:register(t0); 2SamplerState g_sampler:register(s0); 3 4// 頂点シェーダーから出力するデータ 5struct VSOutput 6{ 7 float4 Pos : SV_POSITION; // 頂点の座標(射影座標系) 8 float2 UV : TEXCORD0; //UV座標 9}; 10 11cbuffer AlphaAtai:register(b0) { 12 float cAlphaAtai; 13}; 14 15 16// ピクセルシェーダー 17float4 PS(VSOutput In) : SV_Target0 18{ 19 float4 texColor = g_texture.Sample(g_sampler,In.UV); 20 texColor.a = cAlphaAtai; 21 //上一行を 22 //texColo.a=1.0f 23 //にすると問題なく描画されます。(透過はされませんが) 24 25 return texColor; 26}

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。