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

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

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

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

3DCG

コンピュータの演算により、3次元空間の仮想物体を、2次元平面上で表現する手法である。

HLSL

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

DirectX

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

DXライブラリ

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

Q&A

解決済

1回答

5459閲覧

DxLibによるシェーダーを実装する手順が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

3DCG

コンピュータの演算により、3次元空間の仮想物体を、2次元平面上で表現する手法である。

HLSL

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

DirectX

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

DXライブラリ

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

0グッド

0クリップ

投稿2020/05/10 05:55

シェーダーの実装コードの手順が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(); } }

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

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

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

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

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

guest

回答1

0

ベストアンサー

まず、読み込んだシェーダーを描画の度にON,OFFして下さい。
Dxライブラリの公式サイトに書かれていたこちらの「・剛体メッシュのポイントライトあり描画」をプログラムを閲覧して下さい。
最も重要なのは下記の3点です。特に下2つは、貴方のプログラムの場合は、「 DrawPolygonIndexed3D(Ground_Vertex, 4, Ground_Index, 2, handle, false);」の前後にサンドイッチするような形で書かないといけないので注意して下さい。

// 頂点シェーダーを読み込む VertexShaderHandle = LoadVertexShader( "NormalMesh_PointLightVS.vso" ) ; // ピクセルシェーダーを読み込む PixelShaderHandle = LoadPixelShader( "NormalMesh_PointLightPS.pso" ) ;
// 使用する頂点シェーダーをセット SetUseVertexShader( VertexShaderHandle ) ; // 使用するピクセルシェーダーをセット SetUsePixelShader( PixelShaderHandle ) ;
// 読み込んだ頂点シェーダーの削除 DeleteShader( VertexShaderHandle ) ; // 読み込んだピクセルシェーダーの削除 DeleteShader( PixelShaderHandle ) ;

Dxライブラリの公式サイトのプログラムを見ている限りですと、HGSLよりOpenGL系シェーダーのGLSLな気がします...

投稿2020/05/11 02:04

編集2020/05/11 02:08
stdio

総合スコア3307

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

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

退会済みユーザー

退会済みユーザー

2020/05/12 03:53 編集

つまり、サイトの一番上の行にある通りレンダリングストリームはIDirect3DDevice9::DrawPrimitive関数系の描画関数を呼び出した瞬間にスタートします。の通り描画関数を呼び出すとシェーダーが実行されるがDxLibの場合は関数を切替えないといけないということでしょうか?正確にはVECTOR3Dの型がshader版になってるということなのでしょうか? http://marupeke296.sakura.ne.jp/DXPS_No2_WhatIsDoingInGPU.html
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問