質問: P2 + Value2; GL.Color3(Color.Red); GL.Vertex3(P1); GL.Vertex3(P2); } GL.End(); // SwapBuffer SwapBuffers(); } ```
回答: 質問をするときは最低限のマナーとして、まず環境に関する情報を詳しく書くようにしてください。 OS、デバイスドライバー、IDE、SDK、ライブラリなどのバージョン、ハードウェアの型番など、提示すべき情報は多岐に渡ります。 技術系メーリングリストで質問するときのパターン・ランゲージ glClearColor()およびglClear()でアルファチャンネルを任意の値にクリア(一律設定)することはできますが、動作はあくまで値クリアであり、前回の描画結果に都合よく値をブレンドするものではありません。また、デフォルトのフレームバッファ(バックバッファ)は常に不透過となります。 OpenGLで前回(前フレーム)の描画結果との合成を実現したい場合は、フレームバッファオブジェクト (FBO) を使います。2Dテクスチャに描画結果を保存しておき、次のフレームで矩形ポリゴンに張り付けてアルファ合成します。バッファはピンポン方式で使いまわします。 * 【以下は初期化処理】 1. FBO×2とRGBA 2Dテクスチャ×2を作成(深度バッファの作成は任意) 2. 2DテクスチャをそれぞれのFBOにバインド(深度バッファのバインドは任意) * 【以下はレンダリングループ】 1. FBO#1をGLコンテキストにバインド(描画ターゲットが2Dテクスチャ#1になる) 2. (0,0,0,0)でクリア 3. 深度バッファ書込を無効化して、2Dテクスチャ#2を等倍で半透明描画 4. 深度バッファ書込を有効化して、シーンをレンダリング 5. バックバッファ(フレームバッファ0)をGLコンテキストにバインド 6. 任意の背景色でクリアして、2Dテクスチャ#1を等倍で描画 7. FBO#2をGLコンテキストにバインド(描画ターゲットが2Dテクスチャ#2になる) 8. (0,0,0,0)でクリア 9. 深度バッファ書込を無効化して、2Dテクスチャ#1を等倍で半透明描画 10. 深度バッファ書込を有効化して、シーンをレンダリング 11. バックバッファ(フレームバッファ0)をGLコンテキストにバインド 12. 任意の背景色でクリアして、2Dテクスチャ#2を等倍で描画 13. FBO#1をGLコンテキストにバインド(描画ターゲットが2Dテクスチャ#1になる) 14. (0,0,0,0)でクリア 15. 深度バッファ書込を無効化して、2Dテクスチャ#2を等倍で半透明描画 16. 深度バッファ書込を有効化して、シーンをレンダリング 17. バックバッファ(フレームバッファ0)をGLコンテキストにバインド 18. 任意の背景色でクリアして、2Dテクスチャ#1を等倍で描画 ... ただし、FBOはOpenGL 3.0で標準化された機能であり、OpenGL 2.1以前では拡張GL_EXT_framebuffer_objectとして提供されています。他に、ピクセルバッファオブジェクト (PBO) を使う方法もありますが、PBOはOpenGL 2.1で標準化された機能であり、OpenGL 2.0以前では拡張GL_ARB_pixel_buffer_objectとして提供されています。 なお、2Dテクスチャを等倍で半透明描画する処理に関しては、コンピュートシェーダーを使う方法もあります。 C#/OpenTKの情報はおそらく手に入りにくく、質・量ともに低いので、C/C++の情報を探したほうが早道です。