球をテクスチャにレンダリングし(フレームバッファオブジェクト(FBO)を使用して実行)、そのテクスチャをバックバッファとアルファブレンドする必要があります。これまでのところ、すべてのフレームの先頭でテクスチャをクリアする以外は、テクスチャを使用して処理を行っていません。
私のシーンは、空の空間にある惑星だけで構成されていると言えます。球は、惑星の隣または周囲に表示されます(今のところ月のようなものです)。球をバックバッファに直接レンダリングすると、正しく表示されます。しかし、テクスチャにレンダリングしてからそのテクスチャをバックバッファとブレンドする中間ステップを実行すると、球は惑星の前にある場合にのみ表示され、前にない部分は単に「切り取られます」 ":
glutSolidSphere
FBOにバインドされたRGBA8フルスクリーンテクスチャを使用して球をレンダリングし、すべての球ピクセルが1.0のアルファ値を受け取るようにします。次に、テクスチャをフラグメントシェーダープログラムに渡し、このコードを使用して、アルファブレンディング中にフルスクリーンクワッド(テクスチャがマップされている)をバックバッファーにレンダリングします。
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
glDisable(GL_DEPTH_TEST);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glBegin(GL_QUADS);
glTexCoord2i(0, 1);
glVertex3i(-1, 1, -1); // TOP LEFT
glTexCoord2i(0, 0);
glVertex3i(-1, -1, -1); // BOTTOM LEFT
glTexCoord2i(1, 0);
glVertex3i( 1, -1, -1); // BOTTOM RIGHT
glTexCoord2i(1, 1);
glVertex3i( 1, 1, -1); // TOP RIGHT
glEnd();
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glEnable(GL_DEPTH_TEST);
glDisable(GL_BLEND);
これはシェーダーコードです(Cgで記述されたFXファイルから取得):
sampler2D BlitSamp = sampler_state
{
MinFilter = LINEAR;
MagFilter = LINEAR;
MipFilter = LINEAR;
AddressU = Clamp;
AddressV = Clamp;
};
float4 blendPS(float2 texcoords : TEXCOORD0) : COLOR
{
float4 outColor = tex2D(BlitSamp, texcoords);
return outColor;
}
これがデプスバッファの問題なのかアルファブレンディングの問題なのかさえわかりません。デプステストの有効化と無効化(FBOにデプスバッファを接続)とアルファブレンディングの組み合わせをたくさん試しました。
編集:私は空白のフルスクリーンクワッドをバックバッファーにまっすぐにレンダリングしようとしましたが、それでも惑星の端の周りでトリミングされました。何らかの理由で、クワッドをレンダリングするための深度テストを有効にする(つまり、線glDisable(GL_DEPTH_TEST)
とを削除するglEnable(GL_DEPTH_TEST) in the code above
)ことで問題が解消されましたが、惑星と球以外はすべて白く表示されます。
テクスチャのアルファチャネルが球以外のすべてのピクセルで0であることを確認した(そして確認できた)ので、どこに白さが導入されるのかわかりません。(深度テストを有効にするとこの効果がある理由の説明にも興味があります。)