質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VC++

VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

HLSL

HLSLは、米マイクロソフト社によって開発された Direct3D APIで使われるプロプライエタリなシェーディング言語です。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

Q&A

解決済

1回答

972閲覧

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

tettyA

総合スコア93

VC++

VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

HLSL

HLSLは、米マイクロソフト社によって開発された Direct3D APIで使われるプロプライエタリなシェーディング言語です。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

0グッド

0クリップ

投稿2022/09/02 10:06

前書き

この質問はここのマルチポストです。両方ともマルチポストがOKでしたのでさせていただきました。

質問

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

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

参考にしたサイト

1
2

環境

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}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

投稿2022/09/03 04:11

tettyA

総合スコア93

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問