報告・意見箱のほうで、マルチレンダーターゲットを使わない方法はないのかと質問されたので作ってみました。
大部分は変わらないので、変更点のみ記載をします。
まずは、ブリンフォンシェーダーの変更点です。
ピクセルシェーダーとテクニックの追加のみです。
//ピクセルシェーダー
float4 ps_main_diffuse(
PS_INPUT input,
uniform float4 Ambient,
uniform float4 Diffuse,
uniform float4 Ka,
uniform float4 Kd,
) : COLOR0
{
//ライトベクトルの正規化
float3 L = normalize( input.light );
//法線の正規化
float3 N = normalize( input.normal );
//ディフーズ
float diffuse = max( dot( L, N ), 0 );
//環境光
float4 totalAmbient = Ambient * Ka * input.color;
//拡散反射光
float4 totalDiffuse = Kd * Diffuse * diffuse * input.color;
return totalAmbient + totalDiffuse;
}
float4 ps_main_specular(
PS_INPUT input,
uniform float4 Specular,
uniform float4 Ks,
uniform float power,
uniform float bloomPower
) : COLOR0
{
//PS_OUTPUT output;
//法線の正規化
float3 N = normalize( input.normal );
//二等分べkとるの正規化
float3 H = normalize( input.halfAngle );
//スペキュラ
float specular = pow( max( dot( N, H ), 0 ), power );
float p = specular * bloomPower;
return float4( p, p, p, 1.0f);
}
//テクニックの指定
technique blinnphong_diffuse
{
//パスの指定
pass Pass_0
{
CullFaceEnable = true;
CullFace = Back;
DepthTestEnable = true; //デプステストを有効
VertexProgram = compile arbvp1 vs_main( world, view, projection, light );
FragmentProgram = compile arbfp1 ps_main_diffuse( Ambient, Diffuse, Ka, Kd );
}
}
//テクニックの指定
technique blinnphong_specular
{
//パスの指定
pass Pass_0
{
CullFaceEnable = true;
CullFace = Back;
DepthTestEnable = true; //デプステストを有効
VertexProgram = compile arbvp1 vs_main( world, view, projection, light );
FragmentProgram = compile arbfp1 ps_main_specular( Specular, Ks, power, bloomPower );
}
}
次にメインプログラムの変更点です。
描画関数のみの変更になります。
glBindFramebuffer( GL_FRAMEBUFFER_EXT, fbo ) ~ glBindFramebuffer( GL_FRAMEBUFFER_EXT, 0 ) までのコードを下記のコードに変更してください
//描画
void display()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glEnable( GL_TEXTURE_2D );
glBindTexture( GL_TEXTURE_2D, texture[0] );
blinn->setTechnique( "blinnphong_diffuse" );
blinn->begin();
for( unsigned int pass = 0; pass < blinn->getPassNum(); pass++ ){
blinn->setPass( pass );
//トーラスの描画
glutSolidTorus( 0.5f, 1.0f, 4, 4 );
}
blinn->end();
glCopyTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 640, 480, 0 );
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glBindTexture( GL_TEXTURE_2D, texture[1] );
blinn->setTechnique( "blinnphong_specular" );
blinn->begin();
for( unsigned int pass = 0; pass < blinn->getPassNum(); pass++ ){
blinn->setPass( pass );
//トーラスの描画
glutSolidTorus( 0.5f, 1.0f, 4, 4 );
}
blinn->end();
glBindTexture( GL_TEXTURE_2D, texture[1] );
glCopyTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 640, 480, 0 );
glBindTexture(GL_TEXTURE_2D, 0 );
// 以下同じ
}
glCopyTexImage2Dという関数を使って画面をテクスチャにコピーをしています。
この関数は動作が重いので、ゲームでは使いにくかったりします。
最終更新:2011年03月13日 15:09