DXライブラリでの3Dでスポットライト

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
NATTO

DXライブラリでの3Dでスポットライト

#1

投稿記事 by NATTO » 5年前

VSC++2010EEでDXライブラリを使って3Dゲームを作っているんですが、
ポイントライトを用いて自分の周りを照らして、
自分より遠くは見えない(見えにくい)ように暗くしたいのですが、
全体がほんのり暗くなる程度で、
距離による暗さの違いがでません。
シェーダが関係しているような気がするのですが、
いまいち理解できていないためどう調べたらよいのかも…
できればスポットライトでできるよなおよいのですが、
ひとまずスポットライトで自分の周りを照らせるようにしたいです。

コード:

// WinMain
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
	// ウインドウモードで起動
	ChangeWindowMode( TRUE ) ;

	// ライブラリの初期化
	if( DxLib_Init() < 0 )
		return -1 ;

	// プログラマブルシェーダーモデル3.0が使用できない場合はエラーを表示して終了
	if( GetValidShaderVersion() < 300 )
	{
		// エラー表示
		DrawString( 0, 0, "プログラマブルシェーダー3.0が使用できない環境のようです", GetColor( 255,255,255 ) ) ;

		// キー入力待ち
		WaitKey() ;
		
		// DXライブラリの後始末
		DxLib_End() ;

		// ソフト終了
		return 0 ;
	}
	// プレイヤーの初期化
	Player_Initialize() ;

	// ステージの初期化
	Stage_Initialize() ;

	// モデルの描画にオリジナルシェーダーを使用する設定をONにする
	MV1SetUseOrigShader( TRUE ) ;

	// ピクセルシェーダーを読み込む
	int PixelShaderHandle;
	PixelShaderHandle = LoadPixelShader( "NormalMesh_PointLight_PhongPS.pso" ) ;

	// 使用するピクセルシェーダーをセット
	SetUsePixelShader( PixelShaderHandle ) ;
	
	// 描画先を裏画面にする
	SetDrawScreen( DX_SCREEN_BACK ) ;
	
	// カメラの初期化
	Camera_Initialize() ;

	GHandle = MakeGraph(320,480);

	SetLightEnable(false);

	light.light_handle1 = CreatePointLightHandle(
								VGet(0.0f,0.0f,0.0f),
								//VGet(0.0f,0.0f,1.0f),
								//40.0 * DX_PI_F / 180.0,
								//30.0 * DX_PI_F / 180.0,
								1000.0f,
								0.0f , 0.5f , 0.0f
						  );

	// ライトの光を強くする
	//SetLightDifColorHandle(light.light_handle1, GetColorF( 200.0f, 200.0f, 200.0f, 0.0f ) ) ;

	// ライトのアンビエントカラーを無効にする
	//SetLightAmbColorHandle(light.light_handle1, GetColorF( 0.0f, 0.0f, 0.0f, 0.0f ) ) ;

	char *TypeName ;
    COLOR_F Color ;
    VECTOR Vector ;
    float Range, Atten0, Atten1, Atten2 ;
    float InAngle, OutAngle ;

	// ESCキーが押されるか、ウインドウが閉じられるまでループ
	while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
	{
		// Zキーが押されていれば走り、押されていなければ歩き
		if( CheckHitKey( KEY_INPUT_Z ) ){
			PLAYER_MOVE_SPEED = PLAYER_MOVE_SPEED_R;
			CAMERA_STEP_SPEED = CAMERA_STEP_SPEED_R;
			if( CheckSoundMem( pl.foot_sound_handle ) ){
				StopSoundMem( pl.foot_sound_handle );
				PLAYER_FOOT_SOUND = pl.foot_sound_handle2;
				PlaySoundMem( PLAYER_FOOT_SOUND , DX_PLAYTYPE_BACK );
			}else{
				PLAYER_FOOT_SOUND = pl.foot_sound_handle2;
			}
		}else{
			PLAYER_MOVE_SPEED = PLAYER_MOVE_SPEED_W;
			CAMERA_STEP_SPEED = CAMERA_STEP_SPEED_W;
			if( CheckSoundMem( pl.foot_sound_handle2 ) ){
				StopSoundMem( pl.foot_sound_handle2 );
				PLAYER_FOOT_SOUND = pl.foot_sound_handle;
				PlaySoundMem( PLAYER_FOOT_SOUND , DX_PLAYTYPE_BACK );
			}else{
				PLAYER_FOOT_SOUND = pl.foot_sound_handle;
			}
		}

		// 画面をクリア
		ClearDrawScreen() ;

		// 入力処理
		Input_Process() ;

		// プレイヤーの処理
		Player_Process() ;

		// カメラの処理
		Camera_Process() ;
		
		// ライトの処理
		Light_Process();

		// 描画処理
		Render_Process() ;

		// 裏画面の内容を表画面に反映
		ScreenFlip() ;
	}

	// 読み込んだピクセルシェーダーの削除
	DeleteShader( PixelShaderHandle ) ;

	// プレイヤーの後始末
	Player_Terminate() ;

	// ステージの後始末
	Stage_Terminate() ;

	// ライブラリの後始末
	DxLib_End() ;

	// ソフト終了
	return 0 ;
}

コード:

void Light_Process( void ){
	//SetLightDirectionHandle(light.light_handle1,VGet(0.0f,0.0f,1.0f));
	SetLightPositionHandle(light.light_handle1,VGet(cam.Eye.x,cam.Eye.y+10.0f,cam.Eye.z));
}

コード:

// カメラ情報構造体
struct CAMERA
{
	float		AngleH ;				// 水平角度
	float		AngleV ;				// 垂直角度
	VECTOR		Eye ;					// カメラ座標
	VECTOR		Target ;				// 注視点座標
	float		stepY  ;				// 歩きふり幅
	bool		stepUorD;				// 歩きふり幅がtrueなら↑へ、falseなら↓へ
} ;

//ライトハンドル構造体
struct LIGHT
{
	int light_handle1;					//ハンドル1
	int light_handle2;					//ハンドル2
	int light_handle3;					//ハンドル3
};
Light_Initializeは空です。

もとはDXライブラリのサンプルを使ってます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: DXライブラリでの3Dでスポットライト

#2

投稿記事 by softya(ソフト屋) » 5年前

シェーダーを切れば暗くなりますか?
あとポイントライト1つぐらいなら、シェーダを使わなくても出来ませんか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

NATTO
記事: 9
登録日時: 5年前

Re: DXライブラリでの3Dでスポットライト

#3

投稿記事 by NATTO » 5年前

ライトのAtten1を0.3fにした場合、
シェーダのオンオフにかかわらず、表示されました。
Atten1が0.5fの場合、
シェーダを切ると真っ暗になりました。

シェーダについてあまり理解していないので、
使う場合とかもいまいちわかってないです…

表示されたときの感じの画像です。(暗いかもしれません…)
[album]894[/album]

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: DXライブラリでの3Dでスポットライト

#4

投稿記事 by softya(ソフト屋) » 5年前

なにか話が咬み合っていない気もしてきました。
提示されたコードではAtten1って使われていないのですが、話の流れ的にどうなっている状況でしょうか?
後シェーダーを使わないスポットライトではダメだったのですか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

NATTO
記事: 9
登録日時: 5年前

Re: DXライブラリでの3Dでスポットライト

#5

投稿記事 by NATTO » 5年前

すいません、Atten2の間違いでした。


シェーダを使わずにしようとすると、
距離よる暗さの変化はできましたが、
大きいポリゴンだと表示がおかしくなってしまいます…

[album]895[/album]
(床のポリゴンが大きい)

それで、シェーダを使えばよさそうだったので。
できれば分割はしたくないのですが…

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: DXライブラリでの3Dでスポットライト

#6

投稿記事 by softya(ソフト屋) » 5年前

>大きいポリゴンだと表示がおかしくなってしまいます…
それが理由なのですね。
ところで、提示されたコードではAtten2も使われていない様ですが?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

NATTO
記事: 9
登録日時: 5年前

Re: DXライブラリでの3Dでスポットライト

#7

投稿記事 by NATTO » 5年前

Atten1に0.5f入れていますが、
それではAtten1は作用しないのですか?
(Atten2じゃなくてAtten1であってました)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: DXライブラリでの3Dでスポットライト

#8

投稿記事 by softya(ソフト屋) » 5年前

すいません。やっぱり見ているものが違うとしか思えません。
問題の有るAtten1を使ったソースコードを見せてもらえますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
へにっくす
記事: 628
登録日時: 7年前
住所: 東京都

Re: DXライブラリでの3Dでスポットライト

#9

投稿記事 by へにっくす » 5年前

NATTOさん。はたからみると
もう話が最初からかみ合ってませんよ。

まずNo.1に掲示したソースでは、
70行目に宣言している
float Range, Atten0, Atten1, Atten2 ;
この変数どれも使われていません。

そんなソースを掲示して、
Atten1が0.3fとか言われても全然伝わらないです。

人から指摘を受けた時は、
自分の投稿がどうなっていたかを確認することをつよくお勧めします。
オフトピック
これが理解できないのであれば、
変数の意味って分かってる?と問いたいです。
written by へにっくす

NATTO
記事: 9
登録日時: 5年前

Re: DXライブラリでの3Dでスポットライト

#10

投稿記事 by NATTO » 5年前

本当に申し訳ありません!!

自分はCreatePointLightHandleの引数のAtten1の話をしていたのですが、
そのあとに出てくるデバッグ用の変数float Atten1と紛らわしかったです…


なので、WinMain関数はこうなります。
(サンプルを流用しているので、ソースファイルの分割をしていません…
1000行近くにわかるので、分割しようとはおもってます。)

コード:

// WinMain
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
    // ウインドウモードで起動
    ChangeWindowMode( TRUE ) ;
 
    // ライブラリの初期化
    if( DxLib_Init() < 0 )
        return -1 ;
 
    // プログラマブルシェーダーモデル3.0が使用できない場合はエラーを表示して終了
    if( GetValidShaderVersion() < 300 )
    {
        // エラー表示
        DrawString( 0, 0, "プログラマブルシェーダー3.0が使用できない環境のようです", GetColor( 255,255,255 ) ) ;
 
        // キー入力待ち
        WaitKey() ;
        
        // DXライブラリの後始末
        DxLib_End() ;
 
        // ソフト終了
        return 0 ;
    }
    // プレイヤーの初期化
    Player_Initialize() ;
 
    // ステージの初期化
    Stage_Initialize() ;
 
    // モデルの描画にオリジナルシェーダーを使用する設定をONにする
    MV1SetUseOrigShader( TRUE ) ;
 
    // ピクセルシェーダーを読み込む
    int PixelShaderHandle;
    PixelShaderHandle = LoadPixelShader( "NormalMesh_PointLight_PhongPS.pso" ) ;
 
    // 使用するピクセルシェーダーをセット
    SetUsePixelShader( PixelShaderHandle ) ;
    
    // 描画先を裏画面にする
    SetDrawScreen( DX_SCREEN_BACK ) ;
    
    // カメラの初期化
    Camera_Initialize() ;
 
    GHandle = MakeGraph(320,480);
 
    SetLightEnable(false);
 
    light.light_handle1 = CreatePointLightHandle(
                                VGet(0.0f,0.0f,0.0f),
                                1000.0f,
                                0.0f , 0.3f , 0.0f
                          );
 
    // ESCキーが押されるか、ウインドウが閉じられるまでループ
    while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
    {
        // Zキーが押されていれば走り、押されていなければ歩き
        if( CheckHitKey( KEY_INPUT_Z ) ){
            PLAYER_MOVE_SPEED = PLAYER_MOVE_SPEED_R;
            CAMERA_STEP_SPEED = CAMERA_STEP_SPEED_R;
            if( CheckSoundMem( pl.foot_sound_handle ) ){
                StopSoundMem( pl.foot_sound_handle );
                PLAYER_FOOT_SOUND = pl.foot_sound_handle2;
                PlaySoundMem( PLAYER_FOOT_SOUND , DX_PLAYTYPE_BACK );
            }else{
                PLAYER_FOOT_SOUND = pl.foot_sound_handle2;
            }
        }else{
            PLAYER_MOVE_SPEED = PLAYER_MOVE_SPEED_W;
            CAMERA_STEP_SPEED = CAMERA_STEP_SPEED_W;
            if( CheckSoundMem( pl.foot_sound_handle2 ) ){
                StopSoundMem( pl.foot_sound_handle2 );
                PLAYER_FOOT_SOUND = pl.foot_sound_handle;
                PlaySoundMem( PLAYER_FOOT_SOUND , DX_PLAYTYPE_BACK );
            }else{
                PLAYER_FOOT_SOUND = pl.foot_sound_handle;
            }
        }
 
        // 画面をクリア
        ClearDrawScreen() ;
 
        // 入力処理
        Input_Process() ;
 
        // プレイヤーの処理
        Player_Process() ;
 
        // カメラの処理
        Camera_Process() ;
        
        // ライトの処理
        Light_Process();
 
        // 描画処理
        Render_Process() ;
 
        // 裏画面の内容を表画面に反映
        ScreenFlip() ;
    }
 
    // 読み込んだピクセルシェーダーの削除
    DeleteShader( PixelShaderHandle ) ;
 
    // プレイヤーの後始末
    Player_Terminate() ;
 
    // ステージの後始末
    Stage_Terminate() ;
 
    // ライブラリの後始末
    DxLib_End() ;
 
    // ソフト終了
    return 0 ;
}

アバター
へにっくす
記事: 628
登録日時: 7年前
住所: 東京都

Re: DXライブラリでの3Dでスポットライト

#11

投稿記事 by へにっくす » 5年前

NATTO さんが書きました:自分はCreatePointLightHandleの引数のAtten1の話をしていたのですが、
そのあとに出てくるデバッグ用の変数float Atten1と紛らわしかったです…
変数の話ではないのですね。52行目〜56行目の以下の部分の話ですね。

コード:

light.light_handle1 = CreatePointLightHandle(
                                VGet(0.0f,0.0f,0.0f),
                                1000.0f,
                                0.0f , 0.3f , 0.0f
                          );
リファレンスには確かに
int CreatePointLightHandle( VECTOR Position, float Range, float Atten0, float Atten1, float Atten2 ) ;
とあるので、そう書きたくなるのも分かりますが。
誰もがいちいちリファレンス見る手間をかけるとは限りませんので、注意してください。

・・・あとは他の人にお任せします
(私は3Dに詳しくありませんので)
written by へにっくす

NATTO
記事: 9
登録日時: 5年前

Re: DXライブラリでの3Dでスポットライト

#12

投稿記事 by NATTO » 5年前

紛らわしい書き方をしてしまいました…
これからはリファレンス等を見なくてもわかるような書き方を心がけます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: DXライブラリでの3Dでスポットライト

#13

投稿記事 by softya(ソフト屋) » 5年前

すいません。時間取れなくて何も出来てません。
近々時間が取れたら検証します。
ところで、原点に戻ってDXLIb御本家のサンプルプログラムのままモデルを差し替えてもライトがうまく動作しませんか?
なにか変えてはいけない所を変えてないか心配です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

NATTO
記事: 9
登録日時: 5年前

Re: DXライブラリでの3Dでスポットライト

#14

投稿記事 by NATTO » 5年前

サンプルプログラムのWinMainに
・ChangeLightTypePoint(VGet(pl.Position.x,pl.Position.y,pl.Position.z),5000.0f,0.0f,0.001f,0.0f);
・SetLightPosition(VGet(pl.Position.x,pl.Position.y,pl.Position.z));
の2行だけを追加して、確認しましたが、
結果は変わりませんでした。

言われたことがこれであってるのか自信ありませんが…

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: DXライブラリでの3Dでスポットライト

#15

投稿記事 by softya(ソフト屋) » 5年前

すいません。時間が取れないので、DXライブラリのご本家の掲示板で質問してもらってよいですか?
northさんのを参考に相互リンクをおねがいしますね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

NATTO
記事: 9
登録日時: 5年前

Re: DXライブラリでの3Dでスポットライト

#16

投稿記事 by NATTO » 5年前

DXライブラリ本家質問板でも質問させていただきました。
http://hpcgi2.nifty.com/natupaji/bbs/pa ... ew&no=3428

NATTO
記事: 9
登録日時: 5年前

Re: DXライブラリでの3Dでスポットライト

#17

投稿記事 by NATTO » 5年前

SetUsePixelLighting(TRUE);をDxLib_Init();の前に入れることで、
ポリゴンが大きいままでも思うように動作しました。
ただ、分割して使わない方がはるかに計算量が減るそうなので、
できる限りポリゴンを分割してSetUsePixelLighting関数を使わないようにしていきたいと思います。

NATTO
記事: 9
登録日時: 5年前

Re: DXライブラリでの3Dでスポットライト

#18

投稿記事 by NATTO » 5年前

付き合ってくださった方々本当にありがとうございました!

閉鎖

“C言語何でも質問掲示板” へ戻る