また、一度更新してしまうと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;
}