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

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

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

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

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

Q&A

解決済

1回答

2173閲覧

HLSLでテクスチャがシェーダーで描画されない理由が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

0グッド

0クリップ

投稿2020/06/03 11:53

HLSLで頂点をそのまま描画したいが白くなる原因が知りたい。 ピクセル、頂点シェーダーの読み込みエラーがテクスチャの読み込みエラー等はif文にて確認済みです。
DrawUpdate();で SetUseTextureToShader(); の第一引数に0を設定しましたが動きますが白いです。また1にするとDrawPolygonIndexed3DToShader();で例外がでます。
これはどうしたらいいのでしょうか?

ピクセルシェーダー

// ピクセルシェーダーの入力 struct PS_INPUT { float4 dif : COLOR0 ; // ディフューズカラー float2 texCoords0 : TEXCOORD0 ; // テクスチャ座標 } ; // ピクセルシェーダーの出力 struct PS_OUTPUT { float4 color0 : SV_TARGET0 ; // 色 } ; // 定数バッファピクセルシェーダー基本パラメータ struct DX_D3D11_PS_CONST_BUFFER_BASE { float4 FactorColor ; // アルファ値等 float MulAlphaColor ; // カラーにアルファ値を乗算するかどうか( 0.0f:乗算しない 1.0f:乗算する ) float AlphaTestRef ; // アルファテストで使用する比較値 float2 Padding1 ; int AlphaTestCmpMode ; // アルファテスト比較モード( DX_CMP_NEVER など ) int3 Padding2 ; float4 IgnoreTextureColor ; // テクスチャカラー無視処理用カラー } ; // 基本パラメータ cbuffer cbD3D11_CONST_BUFFER_PS_BASE : register( b1 ) { DX_D3D11_PS_CONST_BUFFER_BASE g_Base ; } ; SamplerState g_DiffuseMapSampler : register( s0 ) ; // ディフューズマップサンプラ Texture2D g_DiffuseMapTexture : register( t0 ) ; // ディフューズマップテクスチャ // main関数 PS_OUTPUT main( PS_INPUT PSInput ) { PS_OUTPUT PSOutput ; float4 TextureDiffuseColor ; // テクスチャカラーの読み込み TextureDiffuseColor = g_DiffuseMapTexture.Sample( g_DiffuseMapSampler, PSInput.texCoords0 ) ; // 出力カラー = テクスチャカラー * ディフューズカラー PSOutput.color0 = TextureDiffuseColor * PSInput.dif ; // 出力パラメータを返す return PSOutput ; }

頂点シェーダー

// 頂点シェーダーの入力 struct VS_INPUT { float3 pos : POSITION0 ; // 座標( ローカル空間 ) float4 spos : POSITION1 ; // 予備座標 float3 norm : NORMAL0 ; // 法線( ローカル空間 ) float3 tan : TANGENT0 ; // 接線( ローカル空間 ) float3 binorm : BINORMAL0 ; // 従法線( ローカル空間 ) float4 dif : COLOR0 ; // ディフューズカラー float4 spc : COLOR1 ; // スペキュラカラー float2 texCoords0 : TEXCOORD0 ; // テクスチャ座標 float2 texCoords1 : TEXCOORD1 ; // サブテクスチャ座標 } ; // 頂点シェーダーの出力 struct VS_OUTPUT { float4 dif : COLOR0 ; // ディフューズカラー float2 texCoords0 : TEXCOORD0 ; // テクスチャ座標 float4 pos : SV_POSITION ; // 座標( プロジェクション空間 ) } ; // 基本パラメータ struct DX_D3D11_VS_CONST_BUFFER_BASE { float4 AntiViewportMatrix[ 4 ] ; // アンチビューポート行列 float4 ProjectionMatrix[ 4 ] ; // ビュー → プロジェクション行列 float4 ViewMatrix[ 3 ] ; // ワールド → ビュー行列 float4 LocalWorldMatrix[ 3 ] ; // ローカル → ワールド行列 float4 ToonOutLineSize ; // トゥーンの輪郭線の大きさ float DiffuseSource ; // ディフューズカラー( 0.0f:マテリアル 1.0f:頂点 ) float SpecularSource ; // スペキュラカラー( 0.0f:マテリアル 1.0f:頂点 ) float MulSpecularColor ; // スペキュラカラー値に乗算する値( スペキュラ無効処理で使用 ) float Padding ; } ; // その他の行列 struct DX_D3D11_VS_CONST_BUFFER_OTHERMATRIX { float4 ShadowMapLightViewProjectionMatrix[ 3 ][ 4 ] ; // シャドウマップ用のライトビュー行列とライト射影行列を乗算したもの float4 TextureMatrix[ 3 ][ 2 ] ; // テクスチャ座標操作用行列 } ; // 基本パラメータ cbuffer cbD3D11_CONST_BUFFER_VS_BASE : register( b1 ) { DX_D3D11_VS_CONST_BUFFER_BASE g_Base ; } ; // その他の行列 cbuffer cbD3D11_CONST_BUFFER_VS_OTHERMATRIX : register( b2 ) { DX_D3D11_VS_CONST_BUFFER_OTHERMATRIX g_OtherMatrix ; } ; // main関数 VS_OUTPUT main( VS_INPUT VSInput ) { VS_OUTPUT VSOutput ; float4 lLocalPosition ; float4 lWorldPosition ; float4 lViewPosition ; // 頂点座標変換 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++( 開始 ) // ローカル座標のセット lLocalPosition.xyz = VSInput.pos ; lLocalPosition.w = 1.0f ; // 座標計算( ローカル→ビュー→プロジェクション ) lWorldPosition.x = dot( lLocalPosition, g_Base.LocalWorldMatrix[ 0 ] ) ; lWorldPosition.y = dot( lLocalPosition, g_Base.LocalWorldMatrix[ 1 ] ) ; lWorldPosition.z = dot( lLocalPosition, g_Base.LocalWorldMatrix[ 2 ] ) ; lWorldPosition.w = 1.0f ; lViewPosition.x = dot( lWorldPosition, g_Base.ViewMatrix[ 0 ] ) ; lViewPosition.y = dot( lWorldPosition, g_Base.ViewMatrix[ 1 ] ) ; lViewPosition.z = dot( lWorldPosition, g_Base.ViewMatrix[ 2 ] ) ; lViewPosition.w = 1.0f ; VSOutput.pos.x = dot( lViewPosition, g_Base.ProjectionMatrix[ 0 ] ) ; VSOutput.pos.y = dot( lViewPosition, g_Base.ProjectionMatrix[ 1 ] ) ; VSOutput.pos.z = dot( lViewPosition, g_Base.ProjectionMatrix[ 2 ] ) ; VSOutput.pos.w = dot( lViewPosition, g_Base.ProjectionMatrix[ 3 ] ) ; // 頂点座標変換 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++( 終了 ) // 出力パラメータセット ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++( 開始 ) VSOutput.texCoords0 = VSInput.texCoords0 ; VSOutput.dif = VSInput.dif ; // 出力パラメータセット ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++( 終了 ) // 出力パラメータを返す return VSOutput ; }

ソースファイル

/* vector型 v変数に頂点配列が入っています。 .resize(4);において4で配列を再初期化 */ /*コンストラクタ 初期化*/ Game::Game() { SetLightEnable(false); //標準ライトを有効にするかどうか? SetUseLighting(false); SetUseZBuffer3D(true); SetWriteZBuffer3D(true); shader_VertexHandle = LoadVertexShader("assets/resource/Shader/ShaderPolygon3DTestVS.vso"); if( SetUseVertexShader(shader_VertexHandle) == -1) { ofs<<"頂点シェーダー読み込み失敗"<<std::endl; exit(1); } shader_PixelHandle = LoadPixelShader("assets/resource/Shader/ShaderPolygon3DTestPS.vso"); if (SetUsePixelShader(shader_PixelHandle) == -1) { ofs << "ピクセルシェーダー読み込み失敗" << std::endl; exit(1); } handle = LoadGraph("assets/resource/texturePos.png"); handle2 = LoadGraph("assets/resource/Enemy.png"); groundHandle = LoadGraph("assets/resource/ground.png"); v.resize(4); /*地面描画 頂点インデックスを設定*/ Ground_Index[0] = 0; Ground_Index[1] = 1; Ground_Index[2] = 2; Ground_Index[3] = 1; Ground_Index[4] = 3; Ground_Index[5] = 2; float yPos = -15; v[0].pos.x = -1000; v[0].pos.y = yPos; v[0].pos.z = 1000; v[0].norm = VGet(0.0f, 0.0f, -1.0f); v[0].dif = color_dif; v[0].spc = color_spc; v[0].u = 0; v[0].v = 0; v[1].pos.x = +1000; v[1].pos.y = yPos; v[1].pos.z = 1000; v[1].norm = VGet(0.0f, 0.0f, -1.0f); v[1].dif = color_dif; v[1].spc = color_spc; v[1].u = 1; v[1].v = 0; v[2].pos.x = -1000; v[2].pos.y = yPos; v[2].pos.z = -1000; v[2].norm = VGet(0.0f, 0.0f, -1.0f); v[2].dif = color_dif; v[2].spc = color_spc; v[2].u = 0; v[2].v = 1; v[3].pos.x = 1000; v[3].pos.y = yPos; v[3].pos.z = -1000; v[3].norm = VGet(0.0f, 0.0f, -1.0f); v[3].dif = color_dif; v[3].spc = color_spc; v[3].u = 1; v[3].v = 1; } /*描画更新*/ void Game::DrawUpdate() { SetCameraPositionAndTarget_UpVecY(VGet(cameraPos.x, cameraPos.y, cameraPos.z), VGet(targetV.x, targetV.y, targetV.z)); if (SetUseTextureToShader(0, groundHandle) == -1) { ofs << "テクスチャを設定エラー" << std::endl; exit(1); } /*頂点シェーダー描画*/ if (DrawPolygonIndexed3DToShader(&v.front(), 4, Ground_Index, 2) == -1) { ofs << "地面描画エラー" << std::endl; exit(1); } }

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

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

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

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

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

guest

回答1

0

ベストアンサー

ソースファイルの

shader_PixelHandle = LoadPixelShader("assets/resource/Shader/ShaderPolygon3DTestPS.vso"); if (SetUsePixelShader(shader_PixelHandle) == -1) { ofs << "ピクセルシェーダー読み込み失敗" << std::endl; exit(1); }

のLoadPixelShader();関数ファイル拡張子.psoのはずが.vsoになっていたたためテクスチャが白くっている原因でした。自己解決です。

投稿2020/06/04 01:26

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問