トップページ > 記事閲覧
pixelshaderのinput構造体のセマンティクスについて
名前:ひるねみ 日時: 2023/05/22 21:41

お世話になっております DirectX11のピクセルシェーダー上で定義したinput構造体の宣言の順番によって、メンバ変数に入る値が変わってしまう問題に遭遇しております。 以下に該当するコードを示します: 最初の宣言: struct Input { float4 color0 : COLOR0; float4 color1 : COLOR1; float2 uv0 : TEXCOORD0; float2 uv1 : TEXCOORD1; float4 screenPos : SV_Position; }; この宣言によると、VERTEX2DSHADER構造体で与えたdifとspcは次のように対応すると想定しています: color0 → dif color1 → spc しかし、実際の挙動は以下のようになります: color0 → float4(0,0,0,255) (!?) color1 → dif そして、color0とcolor1の宣言順を変えた場合: struct Input { float4 color1 : COLOR1; float4 color0 : COLOR0; float2 uv0 : TEXCOORD0; float2 uv1 : TEXCOORD1; float4 screenPos : SV_Position; }; 結果は以下のようになります: color0 → dif color1 → float4(0,0,0,255) (!?) 以上から、セマンティクスよりも構造体宣言順で入る値が決まるのかと疑問に思っています。また、spcで与えた値が取得できないのですが、なにかやり方を間違えているのでしょうか。 私が使っているのはDXライブラリのバージョンは最新版で、directXのバージョンはDirectX11(DX_DIRECT3D_11)です。 お忙しいところ恐縮ですが、何卒ご教授いただければと思います。
メンテ

Page: 1 |

Re: pixelshaderのinput構造体のセマンティクスについて ( No.1 )
名前:管理人 日時:2023/05/23 00:11

すみません、Direct3D 11 を使用した場合の標準の頂点シェーダーでは出力が struct VS_OUTPUT { float4 Position : SV_POSITION ; float4 Diffuse : COLOR0 ; float2 TexCoords0 : TEXCOORD0 ; float2 TexCoords1 : TEXCOORD1 ; }; となっており、spc( COLOR1 )の出力が行われていません また、Direct3D 9 では構造体の中のメンバー変数の順番が異なっても 記述されているセマンティクスに対応する形で値が割り振られますが、 Direct3D 11 ではお察しの通り構造体内の宣言順で値が割り振られますので 頂点シェーダーの出力の struct の定義とピクセルシェーダーの入力の struct の定義は 全く同じにする必要があります なので、ピクセルシェーダーの struct Input の定義を struct Input { float4 Position : SV_POSITION ; float4 Diffuse : COLOR0 ; float2 TexCoords0 : TEXCOORD0 ; float2 TexCoords1 : TEXCOORD1 ; }; として頂ければ正常な入力値が得られますので、よろしければお試しください m(_ _)m
メンテ
Re: pixelshaderのinput構造体のセマンティクスについて ( No.2 )
名前:ひるねみ 日時:2023/05/23 08:34

ありがとうございます。 となると2Dでは、vertex shaderを使えない以上spcとして設定した情報を取得する方法はないという理解でよろしいでしょうか。
メンテ
Re: pixelshaderのinput構造体のセマンティクスについて ( No.3 )
名前:管理人 日時:2023/05/25 01:44

すみません、2Dでも独自の vertex shader が使えると思っていましたが、プログラムを確認した所 独自の vertex shader は使用できませんでした( 記憶違いでした… ) 独自の vertex shader を使えるようにする対応もありかと思いましたが、とりあえず標準のシェーダーで spc を取得できるようにしました お手数で申し訳ありませんが、こちらの修正版をダウンロードしてください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい) ↑ こちらのバージョンでは頂点シェーダーの出力は以下のようになっています struct VS_OUTPUT { float4 Position : SV_POSITION ; float4 Diffuse : COLOR0 ; float4 Specular : COLOR1 ; float2 TexCoords0 : TEXCOORD0 ; float2 TexCoords1 : TEXCOORD1 ; }; なので、最初のご投稿の定義を少し変えて struct Input { float4 screenPos : SV_Position; float4 color0 : COLOR0; float4 color1 : COLOR1; float2 uv0 : TEXCOORD0; float2 uv1 : TEXCOORD1; }; ↑ このようにしていただければ問題なく color1 に spc が渡されると思います よろしければお試しください m(_ _)m
メンテ
Re: pixelshaderのinput構造体のセマンティクスについて ( No.4 )
名前:ひるねみ 日時:2023/05/26 00:13

ご対応ありがとうございます。 ただ修正版を使用し、定義の順番を修正しても、変わりませんでした。 (Windows版 VisualC++ 用のライブラリをD言語から呼び出す形で使用しているのですが、それが悪さをしているのでしょうか...)
メンテ
Re: pixelshaderのinput構造体のセマンティクスについて ( No.5 )
名前:管理人 日時:2023/05/26 02:07

手元では正常に spc の値が使用できることを確認していますので、確かに D言語から呼び出すという 方式が関係しているかもしれません ところで VisualC++ 用のライブラリは Visual C++ 6.0 でも使用できるものから Visual Studio 2012 用のものや 64bit 版の物など何種類も存在するのですが、ひるねみさんが使用されているライブラリファイルはどちらとなりますでしょうか?
メンテ
Re: pixelshaderのinput構造体のセマンティクスについて ( No.6 )
名前:ひるねみ 日時:2023/05/26 02:21

末尾が"vs2015_x64_MT"のものを使用しております。
メンテ
Re: pixelshaderのinput構造体のセマンティクスについて ( No.7 )
名前:管理人 日時:2023/05/27 00:50

ご返答ありがとうございます 手元で vs2015_x64_MT を使用して試してみましたが、やはり問題なく Specular を使用できていました… こちらでテストに使用したファイルをアップしましたので、よろしければダウンロードしてください m(_ _)m https://dxlib.xsrv.jp/temp/UseSpecluarShaderTest.zip ( zipファイルの中の UseSpecularShaderTest.exe を実行すると画面左上に黄色い四角が描画されます ) テストで使用したピクセルシェーダーのコードは以下のようになっていますので、ひるねみさんが試された コードと差異が無いか確認してみてください m(_ _)m // ピクセルシェーダーの入力 struct PS_INPUT { float4 Position : SV_POSITION ; float4 Diffuse : COLOR0 ; float4 Specular : COLOR1 ; float2 TexCoords0 : TEXCOORD0 ; float2 TexCoords1 : TEXCOORD1 ; } ; // ピクセルシェーダーの出力 struct PS_OUTPUT { float4 Color0 : SV_TARGET0 ; } ; // main関数 PS_OUTPUT main( PS_INPUT PSInput ) { PS_OUTPUT PSOutput ; PSOutput.Color0 = PSInput.Diffuse + PSInput.Specular ; return PSOutput ; } 上記のように Diffuse( COLOR0 ) と Specular( COLOR1 ) を足してそのまま出力カラーとしています そして、C++ のコードは以下のようになっていて #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode( TRUE ) ; if( DxLib_Init() == -1 ) { return -1 ; } int pshandle = LoadPixelShader( "PixelShader.pso" ) ; SetDrawScreen( DX_SCREEN_BACK ) ; SetUsePixelShader( pshandle ) ; VERTEX2DSHADER Vert[ 6 ] ; Vert[ 0 ].pos = VGet( 0.0f, 0.0f, 0.0f ) ; Vert[ 0 ].rhw = 1.0f ; Vert[ 0 ].dif = GetColorU8( 255, 0, 0,255 ) ; Vert[ 0 ].spc = GetColorU8( 0, 255, 0, 0 ) ; Vert[ 0 ].u = 0.0f ; Vert[ 0 ].v = 0.0f ; Vert[ 0 ].su = 0.0f ; Vert[ 0 ].sv = 0.0f ; Vert[ 1 ].pos = VGet( 128.0f, 0.0f, 0.0f ) ; Vert[ 1 ].rhw = 1.0f ; Vert[ 1 ].dif = GetColorU8( 255, 0, 0,255 ) ; Vert[ 1 ].spc = GetColorU8( 0, 255, 0, 0 ) ; Vert[ 1 ].u = 0.0f ; Vert[ 1 ].v = 0.0f ; Vert[ 1 ].su = 0.0f ; Vert[ 1 ].sv = 0.0f ; Vert[ 2 ].pos = VGet( 0.0f, 128.0f, 0.0f ) ; Vert[ 2 ].rhw = 1.0f ; Vert[ 2 ].dif = GetColorU8( 255, 0, 0,255 ) ; Vert[ 2 ].spc = GetColorU8( 0, 255, 0, 0 ) ; Vert[ 2 ].u = 0.0f ; Vert[ 2 ].v = 0.0f ; Vert[ 2 ].su = 0.0f ; Vert[ 2 ].sv = 0.0f ; Vert[ 3 ].pos = VGet( 128.0f, 128.0f, 0.0f ) ; Vert[ 3 ].rhw = 1.0f ; Vert[ 3 ].dif = GetColorU8( 255, 0, 0,255 ) ; Vert[ 3 ].spc = GetColorU8( 0, 255, 0, 0 ) ; Vert[ 3 ].u = 0.0f ; Vert[ 3 ].v = 0.0f ; Vert[ 3 ].su = 0.0f ; Vert[ 3 ].sv = 0.0f ; Vert[ 4 ] = Vert[ 2 ]; Vert[ 5 ] = Vert[ 1 ]; DrawPolygon2DToShader( Vert, 2 ) ; ScreenFlip() ; WaitKey() ; DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 } dif に R=255 G=0 B=0 spc に R=0 G=255 B=0 を代入してポリゴンを描画していて sif と spc が足されないと黄色( R=255 G=255 B=0 )にならないので 描画される四角形が黄色になるかどうかで spc が問題なく使用できているかを判断しています
メンテ
Re: pixelshaderのinput構造体のセマンティクスについて ( No.8 )
名前:ひるねみ 日時:2023/05/27 23:41

ありがとうございます。 こちらのサンプルと同様のプログラムで無事に黄色になることが確認できました。 ただ、サンプルのDrawPolygon2DToShader関数では(DrawPrimitive2DToShaderでも)うまくいったのですが、 DrawPrimitiveIndexed2DToShader、DrawPrimitive32bitIndexed2DToShaderを使用すると、Ver 3.24bと同様の挙動をしめすようです。
メンテ
Re: pixelshaderのinput構造体のセマンティクスについて ( No.9 )
名前:管理人 日時:2023/05/28 02:03

すみません、手元でも DrawPrimitiveIndexed2DToShader と DrawPrimitive32bitIndexed2DToShader では spc が使用できない不具合を確認しました DrawPrimitiveIndexed2DToShader と DrawPrimitive32bitIndexed2DToShader でも正常に spc を使用できるように 修正したバージョンをアップしましたので、よろしければお試しください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい)
メンテ
Re: pixelshaderのinput構造体のセマンティクスについて ( No.10 )
名前:ひるねみ(解決) 日時:2023/05/28 23:16

お手数おかけしました。 無事、spc色を取得することが出来ました。 ありがとうございます。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存