シェーダーの実装コードの手順がDirectXの実装と異なるためわかりません。まずシェーダーバイナリを単純に読み込んでそこからシェーダーコードをいじろうと思っています。サイトが見つかりません
////コメント部の内部です。実装コードは正しいのでしょうか?if文で分岐していますが-1が返ってくるとexit(1);で強制終了するはずなので
終了しないつまり画面が閉じないということはしっかりシェーダーコードファイルが読み込まれているのでしょうか?
またDraw_Update();のfor文の下のDrawPolygonIndexed3DToShader();関数の使い方ですがリファレンスを見ると
シェーダーを使って2Dポリゴンを描画する(インデックスを使用)と書いてありますがこれを使って描画するのでしょうか?
参考サイト
https://yttm-work.jp/shader/shader_0001.html
https://dxlib.xsrv.jp/function/dxfunc_3d.html#R17N2
http://marupeke296.com/ProShader_main.html
#include "DxLib.h" #include "Game.hpp" #include "Input.hpp" #include "Frame.hpp" #include "Vector.hpp" const char* filename = "Log.txt"; std::ofstream ofs(filename); /*コンストラクタ 初期化*/ Game::Game() { /*操作切替*/ mc = ModeChange::rotate; /*ライト設定*/ LightHandle = CreateDirLightHandle(VGet(0, -1, 0)); if (LightHandle == -1) { exit(1); } SetLightEnable(false); //標準ライトを有効にするかどうか? SetUseLighting(false); SetUseZBuffer3D(true); SetWriteZBuffer3D(true); handle = LoadGraph("assets/resource/texturePos.png"); cameraPos.x = 0; cameraPos.y = 20; cameraPos.z = -40; targetV.x = 0; targetV.y = 0; targetV.z = 0; /*上 手前から右回りで 回ったら下で手前から右回り 省略*/ //////////////////////////////////////////////////////////上の面の頂点 Vertex[0].pos = VGet(targetV.x - RANGE, targetV.y + RANGE, targetV.z - RANGE); Vertex[0].norm = VGet(0.0f, 0.0f, -1.0f); Vertex[0].dif = color_dif; Vertex[0].spc = color_spc; Vertex[0].u = 0.0f; Vertex[0].v = 0.0f; /*地面 ポリゴン*/ Ground_Vertex[0].pos = VGet(-GROUND_X, GROUND_Y, GROUND_Z); Ground_Vertex[0].norm = VGet(0.0f, 0.0f, -1.0f); Ground_Vertex[0].dif = color_dif; Ground_Vertex[0].spc = color_spc; Ground_Vertex[0].u = 0.0f; Ground_Vertex[0].v = 0.0f; ////////////////////////////////////////////////////////////////////////// /*Shader 設定*/ sh_V_handle = LoadVertexShader("assets/source/VertexShader.vso"); if (sh_V_handle == -1) { exit(1); } sh_V_handle = SetUseVertexShader(sh_V_handle); if (sh_V_handle == -1) { exit(1); } if (SetUseTextureToShader(0, handle) == -1) { exit(1); } ////////////////////////////////////////////////////////////////////////// Vertex_Norm(); } void Game::Update() { change(); /*カメラ回転*/ if (Input::keyboard(KEY_INPUT_LEFT) > 0) { rotate(&cameraPos, ROTATE_SPEED, targetV, Vector(0, 1, 0)); } else if (Input::keyboard(KEY_INPUT_RIGHT) > 0) { rotate(&cameraPos, ROTATE_SPEED, targetV, Vector(0, -1, 0)); } else if (Input::keyboard(KEY_INPUT_UP) > 0) { rotate(&cameraPos, ROTATE_SPEED, targetV, get_axis(cameraPos, targetV, Vector(0, 1, 0))); } else if (Input::keyboard(KEY_INPUT_DOWN) > 0) { rotate(&cameraPos, ROTATE_SPEED, targetV, get_axis(cameraPos, targetV, Vector(0, -1, 0))); } /*編集*/ switch (mc) { } // Vertex_Norm(); } /*確認用 描画*/ void Game::Debug_Draw() { DrawFormatString(0, 0, GetColor(255, 255, 255), "カメラ 座標 x: %.2f , y: %.2f , z:%.2f ", cameraPos.x, cameraPos.y, cameraPos.z); int t = GetValidShaderVersion() / 100; //DrawFormatString(0, 0, GetColor(255, 255, 255), "シェーダー: %d",t); DrawFormatString(0, 32 * 1, GetColor(255, 255, 255), "注視点 座標 x: %.2f , y: %.2f , z:%.2f ", targetV.x, targetV.y, targetV.z); } void Game::DrawUpdate() { // DrawFormatString(0, 32 * 3, GetColor(255, 255, 255), "chqnge();"); SetCameraPositionAndTarget_UpVecY(VGet(cameraPos.x, cameraPos.y, cameraPos.z), VGet(targetV.x, targetV.y, targetV.z)); /*キューブ描画*/ for (int i = 0; i < 6; i++) { switch (i) { /*手前*/ case 0: { Vertex[0].u = 0.0; Vertex[0].v = 0.0; Vertex[1].u = 1.0; Vertex[1].v = 0.0; Vertex[4].u = 0.0; Vertex[4].v = 1.0; Vertex[5].u = 1.0; Vertex[5].v = 1.0; } break;//同じようなコードのため省略 // DrawPolygonIndexed3D(Vertex, 8, Index[i], 2, DX_NONE_GRAPH, false); // DrawPolygonIndexed3D(Vertex, 8, Index[i], 2, handle, false); } ////////////////////////////////////////////////////////////////////////////////// if (DrawPolygonIndexed3DToShader(Vertex, 8, Index[i], 2) == -1) { exit(1); } ////////////////////////////////////////////////////////////////////////////////// } /*平面描画*/ DrawPolygonIndexed3D(Ground_Vertex, 4, Ground_Index, 2, handle, false); /*ライト*/ // SetLightEnableHandle(LightHandle,true); Debug_Draw(); }
シェーダーコード
float4x4 matWVP : WorldViewProjection; struct vertexInput { float3 Position : POSITION; }; struct vertexOutput { float3 HPosition : POSITION; float4 Diffuse : COLORD; }; //vertexOutput VS_TransformDiffuse(vertexInput IN) vertexOutput main(vertexInput IN) { vertexOutput OUT; // OUT.HPosition = mul(float4(IN.Position.xyz, 1.0f), matWVP); // OUT.Diffuse = float4(1.0f, 1.0f, 1.0f, 1.0f); return OUT; } technique textured { pass p0 { VertexShader = compile vs_5_0 main(); } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/05/12 03:53 編集