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

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

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

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

C++

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

HLSL

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

DirectX

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

Q&A

解決済

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

tettyA
tettyA

総合スコア90

VC++

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

C++

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

HLSL

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

DirectX

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

1回答

0グッド

0クリップ

313閲覧

投稿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}

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

0

自己解決

投稿2022/09/03 04:11

tettyA

総合スコア90

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

VC++

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

C++

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

HLSL

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

DirectX

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