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

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

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

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

DirectX

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

受付中

Direct3D11でマルチテクスチャを実装したい

futonmin
futon03

総合スコア33

C++

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

DirectX

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

1回答

0リアクション

1クリップ

793閲覧

投稿2022/02/06 08:45

編集2022/02/06 08:47

前提・実現したいこと

DirectX11,C/C++でマルチテクスチャを実装したいです。
ポリゴンに1枚のテクスチャを貼るところまではできています。
2枚のテクスチャをブレンドしようとすると、最初に貼ったテクスチャが上書きされてしまいます。

実現したいこと
イメージ説明

現状
イメージ説明

該当のソースコード

c++

// 初期化 HRESULT InitSampleShader(void) { ID3D11Device* pDevice = GetDevice(); HRESULT hr; HWND hWnd = GetMainWnd(); // シェーダ初期化 static const D3D11_INPUT_ELEMENT_DESC layout[] = { D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0}, {"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, {"NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, {"COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, {"TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, }; hr = LoadShader("VertexShader", "PixelShader", &g_pVertexShader, &g_pInputLayout, &g_pPixelShader, layout, _countof(layout)); if (FAILED(hr)) { return hr; } // 定数バッファ生成 D3D11_BUFFER_DESC bd; ZeroMemory(&bd, sizeof(bd)); bd.Usage = D3D11_USAGE_DEFAULT; bd.ByteWidth = sizeof(SHADER_GLOBAL); bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER; bd.CPUAccessFlags = 0; hr = pDevice->CreateBuffer(&bd, nullptr, &g_pConstantBuffer[0]); if (FAILED(hr)) return hr; bd.ByteWidth = sizeof(SHADER_GLOBAL2); hr = pDevice->CreateBuffer(&bd, nullptr, &g_pConstantBuffer[1]); if (FAILED(hr)) return hr; // テクスチャ サンプラ生成 D3D11_SAMPLER_DESC sd; ZeroMemory(&sd, sizeof(sd)); sd.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; sd.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; sd.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; sd.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; hr = pDevice->CreateSamplerState(&sd, &g_pSamplerState); if (FAILED(hr)) { return hr; } // 位置回転拡大率の初期化 g_mesh.pos = XMFLOAT3(0.0f, 0.0f, 0.0f); g_mesh.rot = XMFLOAT3(0.0f, 0.0f, 0.0f); // マテリアルの初期設定 g_material.Diffuse = M_DIFFUSE; g_material.Ambient = M_AMBIENT; g_material.Specular = M_SPECULAR; g_material.Power = 1.0f; g_material.Emissive = M_EMISSIVE; // 1枚目のテクスチャの読み込み hr = CreateTextureFromFile(pDevice, TEXTURE_FIELD, &g_mesh.pTexture); if (FAILED(hr)) { MessageBox(hWnd, _T("地面テクスチャ読み込みエラー"), _T("Error"), MB_OK | MB_ICONSTOP); return hr; } XMStoreFloat4x4(&g_mesh.mtxTexture, XMMatrixIdentity()); // 2枚目のテクスチャの読み込み // おそらくここで上書きしてしまっている。 hr = CreateTextureFromFile(pDevice, TEXTURE_BAMP1, &g_mesh.pTexture); if (FAILED(hr)) { MessageBox(hWnd, _T("地面テクスチャ読み込みエラー"), _T("Error"), MB_OK | MB_ICONSTOP); return hr; } XMStoreFloat4x4(&g_mesh.mtxTexture, XMMatrixIdentity()); // VERTEX_3D vertexWk[NUM_VERTEX]; //作業用頂点情報 int indexWk[NUM_VERTEX]; //作業用インデックス // 頂点座標の設定 g_mesh.nNumVertex = NUM_VERTEX; vertexWk[0].vtx = XMFLOAT3(-SIZE_X, 0.0f, SIZE_Z); vertexWk[1].vtx = XMFLOAT3(SIZE_X, 0.0f, SIZE_Z); vertexWk[2].vtx = XMFLOAT3(-SIZE_X, 0.0f, -SIZE_Z); vertexWk[3].vtx = XMFLOAT3(SIZE_X, 0.0f, -SIZE_Z); // ディフューズの設定 vertexWk[0].diffuse = XMFLOAT4(1.0f, 1.0f, 1.0f, 1.0f); vertexWk[1].diffuse = XMFLOAT4(1.0f, 1.0f, 1.0f, 1.0f); vertexWk[2].diffuse = XMFLOAT4(1.0f, 1.0f, 1.0f, 1.0f); vertexWk[3].diffuse = XMFLOAT4(1.0f, 1.0f, 1.0f, 1.0f); // 法線ベクトルの設定 vertexWk[0].nor = XMFLOAT3(0.0f, 1.0f, 0.0f); vertexWk[1].nor = XMFLOAT3(0.0f, 1.0f, 0.0f); vertexWk[2].nor = XMFLOAT3(0.0f, 1.0f, 0.0f); vertexWk[3].nor = XMFLOAT3(0.0f, 1.0f, 0.0f); // テクスチャ座標の設定 vertexWk[0].tex = XMFLOAT2(0.0f, 0.0f); vertexWk[1].tex = XMFLOAT2(1.0f, 0.0f); vertexWk[2].tex = XMFLOAT2(0.0f, 1.0f); vertexWk[3].tex = XMFLOAT2(1.0f, 1.0f); // インデックス配列の設定 g_mesh.nNumIndex = NUM_VERTEX; indexWk[0] = 0; indexWk[1] = 1; indexWk[2] = 2; indexWk[3] = 3; g_mesh.fAlpha = 1.0f; for (int i = 0; i < g_mesh.nNumVertex; ++i) { if (g_mesh.fAlpha > vertexWk[i].diffuse.w) { g_mesh.fAlpha = vertexWk[i].diffuse.w; } } D3D11_BUFFER_DESC vbd; ZeroMemory(&vbd, sizeof(vbd)); vbd.Usage = D3D11_USAGE_DYNAMIC; vbd.ByteWidth = sizeof(VERTEX_3D) * g_mesh.nNumVertex; vbd.BindFlags = D3D11_BIND_VERTEX_BUFFER; vbd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; vbd.MiscFlags = 0; D3D11_SUBRESOURCE_DATA initData; ZeroMemory(&initData, sizeof(initData)); initData.pSysMem = vertexWk; hr = pDevice->CreateBuffer(&vbd, &initData, &g_mesh.pVertexBuffer); if (FAILED(hr)) { return hr; } CD3D11_BUFFER_DESC ibd(g_mesh.nNumIndex * sizeof(int), D3D11_BIND_INDEX_BUFFER); ZeroMemory(&initData, sizeof(initData)); initData.pSysMem = indexWk; hr = pDevice->CreateBuffer(&ibd, &initData, &g_mesh.pIndexBuffer); return hr; }

hlsl

// 頂点シェーダ // グローバル cbuffer global : register(b0) { matrix g_mWVP; matrix g_mWorld; matrix g_mTexture; }; // パラメータ struct VS_INPUT { float3 Position : POSITION; float3 Normal : NORMAL; float2 TexCoord : TEXCOORD0; float4 Diffuse : COLOR0; }; struct VS_OUTPUT { float4 Position : SV_Position; float3 Pos4PS : TEXCOORD0; float3 Normal : TEXCOORD1; float2 TexCoord : TEXCOORD2; float4 Diffuse : COLOR0; }; VS_OUTPUT main(VS_INPUT input) { VS_OUTPUT output; float4 P = float4(input.Position, 1.0f); output.Position = mul(P, g_mWVP); output.Pos4PS = mul(P, g_mWorld).xyz; output.Normal = mul(float4(input.Normal, 0.0f), g_mWorld).xyz; output.TexCoord = mul(float4(input.TexCoord, 0.0f, 1.0f), g_mTexture).xy; output.Diffuse = input.Diffuse; return output; }

hlsl

// ピクセルシェーダ // グローバル cbuffer global : register(b1) { float4 g_vEye; // 視点座標 // 光源 float4 g_vLightDir; // 光源方向 float4 g_vLa; // 環境光 float4 g_vLd; // 拡散反射光 float4 g_vLs; // 鏡面反射光 // マテリアル float4 g_vKa; // アンビエント色(+テクスチャ有無) float4 g_vKd; // ディフューズ色 float4 g_vKs; // スペキュラ色(+スペキュラ強度) float4 g_vKe; // エミッシブ色 }; // パラメータ struct VS_OUTPUT { float4 Position : SV_Position; float3 Pos4PS : TEXCOORD0; float3 Normal : TEXCOORD1; float2 TexCoord : TEXCOORD2; float4 Diffuse : COLOR0; }; Texture2D g_texture[2] : register(t0); // テクスチャ // ここで2枚のテクスチャを用意 SamplerState g_sampler : register(s0); // サンプラ float4 main(VS_OUTPUT input) : SV_Target0 { float3 Diff = input.Diffuse.rgb * g_vKd.rgb; float Alpha = input.Diffuse.a * g_vKd.a; if (g_vKa.a > 0.0f) { // テクスチャ有 float4 vTd = g_texture[0].Sample(g_sampler, input.TexCoord); float4 vTd1 = g_texture[1].Sample(g_sampler, input.TexCoord); //Diff *= vTd.rgb; //Alpha *= vTd.a; // ここでブレンドしてるつもり Diff *= (vTd.rgb * vTd1.rgb * 2.0); Alpha *= (vTd.a * vTd1.a * 2.0); } //clip(Alpha - 0.0001f); if (Alpha <= 0.0f) discard; if (g_vLightDir.x != 0.0f || g_vLightDir.y != 0.0f || g_vLightDir.z != 0.0f) { // 光源有効 float3 L = normalize(-g_vLightDir.xyz); // 光源へのベクトル float3 N = normalize(input.Normal); // 法線ベクトル float3 V = normalize(g_vEye.xyz - input.Pos4PS); // 視点へのベクトル float3 H = normalize(L + V); // ハーフベクトル Diff = g_vLa.rgb * g_vKa.rgb + g_vLd.rgb * Diff * saturate(dot(L, N)); // 拡散色 + 環境色 float3 Spec = g_vLs.rgb * g_vKs.rgb * pow(saturate(dot(N, H)), g_vKs.a); // 鏡面反射色 Diff += Spec; } Diff += g_vKe.rgb; return float4(Diff, Alpha); }

試したこと

http://dioltista.blogspot.com/2019/05/c-directx11_29.html

補足情報(FW/ツールのバージョンなど)

Windows10
DirectX11
Visual Studio2019 Community

文字数オーバーで描画処理のソースが載せられませんでした。
参考にした記事を見るあたり、あまり関係ないと思うのですが要望があれば別の記事を作りうpします。

以下のような質問にはリアクションをつけましょう

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

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

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

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

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

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

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

C++

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

DirectX

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