// 影用の深度記録画像を使った影を落とす処理も含めたモデルの描画 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 ) ; }
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int grhandle, pshandle ; VERTEX2DSHADER Vert[ 6 ] ; // ウインドウモードで起動 ChangeWindowMode( TRUE ); // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1; // 画像の読み込み grhandle = LoadGraph( "Test1.bmp" ); // ピクセルシェーダーバイナリコードの読み込み pshandle = LoadPixelShader( "SamplePS.pso" ) ; // 頂点データの準備 Vert[ 0 ].pos = VGet( 0.0f, 0.0f, 0.0f ) ; Vert[ 1 ].pos = VGet( 128.0f, 0.0f, 0.0f ) ; Vert[ 2 ].pos = VGet( 0.0f, 512.0f, 0.0f ) ; Vert[ 3 ].pos = VGet( 128.0f, 512.0f, 0.0f ) ; Vert[ 0 ].dif = GetColorU8( 255,255,255,255 ) ; Vert[ 0 ].spc = GetColorU8( 0,0,0,0 ) ; Vert[ 0 ].u = 0.0f ; Vert[ 0 ].v = 0.0f ; Vert[ 1 ].u = 1.0f ; Vert[ 1 ].v = 0.0f ; Vert[ 2 ].u = 0.0f ; Vert[ 2 ].v = 1.0f ; Vert[ 3 ].u = 1.0f ; Vert[ 3 ].v = 1.0f ; Vert[ 0 ].su = 0.0f ; Vert[ 0 ].sv = 0.0f ; Vert[ 1 ].su = 1.0f ; Vert[ 1 ].sv = 0.0f ; Vert[ 2 ].su = 0.0f ; Vert[ 2 ].sv = 1.0f ; Vert[ 3 ].su = 1.0f ; Vert[ 3 ].sv = 1.0f ; Vert[ 0 ].rhw = 1.0f ; Vert[ 1 ].rhw = 1.0f ; Vert[ 2 ].rhw = 1.0f ; Vert[ 3 ].rhw = 1.0f ; Vert[ 4 ] = Vert[ 2 ] ; Vert[ 5 ] = Vert[ 1 ] ; // 使用するテクスチャをセット SetUseTextureToShader( 0, grhandle ) ; // 使用するピクセルシェーダーをセット SetUsePixelShader( pshandle ) ; // 描画 DrawPrimitive2DToShader( Vert, 6, DX_PRIMTYPE_TRIANGLELIST ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; }
static void begin_phong_pass(Shader *self) { // 影用深度記録画像を描画したときのカメラのビュー行列と射影行列を定数に設定する SetVSConstFMtx(43, self->light_camera_view_matrix); SetVSConstFMtx(47, self->light_camera_projection_matrix); // 影用深度記録画像をテクスチャ1にセット SetUseTextureToShader(1, self->depthmap_screen); SetUseVertexShader(self->phong_vs); SetUsePixelShader(self->phong_ps); }
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; }