// 影用の深度記録画像を使った影を落とす処理も含めたモデルの描画 void DrawModelWithDepthShadow( void ) { int i ; // カメラの設定を行う SetCameraPositionAndTarget_UpVecY( cam.Eye, cam.Target ) ; // モデルの描画にオリジナルのシェーダーを使用するように設定する MV1SetUseOrigShader( TRUE ) ; // 深度記録画像を使った影+ディレクショナルライト一つ描画用のピクセルシェーダーをセット SetUsePixelShader( DirLight_DepthShadow_Step2_PixelShader ) ; // 影用深度記録画像を描画したときのカメラのビュー行列と射影行列を定数に設定する SetVSConstFMtx( 43, LightCamera_ViewMatrix ) ; SetVSConstFMtx( 47, LightCamera_ProjectionMatrix ) ; // 影用深度記録画像をテクスチャ1にセット SetUseTextureToShader( 1, DepthBufferGraphHandle ) ; // 深度記録画像を使った影+ディレクショナルライト一つの剛体メッシュ描画用の頂点シェーダーをセット SetUseVertexShader( Normal_DirLight_DepthShadow_Step2_VertexShader ) ; // ステージモデルの描画 MV1DrawModel( stg.ModelHandle ) ; // 深度記録画像を使った影+ディレクショナルライト一つのスキニングメッシュ描画用の頂点シェーダーをセット SetUseVertexShader( Skin4_DirLight_DepthShadow_Step2_VertexShader ) ; // プレイヤーモデルの描画 MV1DrawModel( pl.CharaInfo.ModelHandle ) ; // プレイヤー以外キャラモデルの描画 for( i = 0 ; i < NOTPLAYER_NUM ; i ++ ) { MV1DrawModel( npl[ i ].CharaInfo.ModelHandle ) ; } // モデルの描画にオリジナルのシェーダーを使用するようにした設定を解除 MV1SetUseOrigShader( FALSE ) ; // 使用テクスチャの設定を解除 SetUseTextureToShader( 1, -1 ) ; // 設定した定数を解除 ResetVSConstF( 43, 8 ) ; }
void Shader_End(Shader *self) { if (self->active_pass == 0) { SetDrawScreen(DX_SCREEN_BACK); } else if (self->active_pass == 1) { SetUseTextureToShader(1, -1); ResetVSConstF(43, 8); } else if (self->active_pass == -1) { fprintf(stderr, "warning: Shader: shader not active\n"); } else { fprintf(stderr, "warning: Shader: unexpected pass number\n"); } MV1SetUseOrigShader(FALSE); self->active_pass = -1; }
void Shader_Begin(Shader *self, int pass) { if (self->active_pass != -1) { fprintf(stderr, "warning: Shader: already shader active\n"); } if (pass == 0) { begin_depthmap_pass(self); } else if (pass == 1) { begin_phong_pass(self); } else { fprintf(stderr, "warning: Shader: unexpected pass number\n"); return; } self->active_pass = pass; MV1SetUseOrigShader(TRUE); }
// 影用の深度記録画像の準備を行う void SetupDepthImage( void ) { int i ; VECTOR LightDirection ; VECTOR LightPosition ; VECTOR LightTarget ; // 描画先を影用深度記録画像にする SetDrawScreen( DepthBufferGraphHandle ) ; // 影用深度記録画像を真っ白にクリア SetBackgroundColor( 255, 255, 255 ) ; ClearDrawScreen() ; SetBackgroundColor( 0, 0, 0 ) ; // カメラのタイプを正射影タイプにセット、描画範囲も指定 SetupCamera_Ortho( 13250.0f ) ; // 描画する奥行き範囲をセット SetCameraNearFar( 10.0f, 13050.0f ) ; // カメラの向きはライトの向き LightDirection = GetLightDirection() ; // カメラの位置と注視点はステージ全体が見渡せる位置 LightTarget.x = 3620.0f ; LightTarget.y = 0.0f ; LightTarget.z = 3830.0f ; LightPosition = VAdd( LightTarget, VScale( LightDirection, -12400.0f ) ) ; SetCameraPositionAndTarget_UpVecY( LightPosition, LightTarget ) ; // 設定したカメラのビュー行列と射影行列を取得しておく LightCamera_ViewMatrix = GetCameraViewMatrix() ; LightCamera_ProjectionMatrix = GetCameraProjectionMatrix() ; // モデルの描画にオリジナルのシェーダーを使用するように設定する MV1SetUseOrigShader( TRUE ) ; // 深度記録画像への描画用のピクセルシェーダーをセット SetUsePixelShader( DepthShadow_Step1_PixelShader ) ; // 深度記録画像への剛体メッシュ描画用の頂点シェーダーをセット SetUseVertexShader( Normal_DepthShadow_Step1_VertexShader ) ; // ステージを描画 MV1DrawModel( stg.ModelHandle ) ; // 深度記録画像へのスキニングメッシュ描画用の頂点シェーダーをセット SetUseVertexShader( Skin4_DepthShadow_Step1_VertexShader ) ; // プレイヤーモデルの描画 MV1DrawModel( pl.CharaInfo.ModelHandle ) ; // プレイヤー以外キャラモデルの描画 for( i = 0 ; i < NOTPLAYER_NUM ; i ++ ) { MV1DrawModel( npl[ i ].CharaInfo.ModelHandle ) ; } // モデルの描画にオリジナルのシェーダーを使用するようにした設定を解除 MV1SetUseOrigShader( FALSE ) ; // 描画先を裏画面に戻す SetDrawScreen( DX_SCREEN_BACK ) ; }