ポイントライトを用いて自分の周りを照らして、
自分より遠くは見えない(見えにくい)ように暗くしたいのですが、
全体がほんのり暗くなる程度で、
距離による暗さの違いがでません。
シェーダが関係しているような気がするのですが、
いまいち理解できていないためどう調べたらよいのかも…
できればスポットライトでできるよなおよいのですが、
ひとまずスポットライトで自分の周りを照らせるようにしたいです。
// 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
};
もとはDXライブラリのサンプルを使ってます。