

現在C# OpenTKを使って3Dグラフィックスを描いています

質問は半透過ブラック(0,0,0,0.5)でGL.Clearすることはできるか教えてください。

現在、音楽波形をLinesを使って、描画しています  
その際、毎回黒でclearするのではなく、  
半透過の黒でclearすることで、  
1フレーム前の線を薄く残し、ブラーのような演出にならないかと思っているのですが  
GL.ClearColor(0,0,0,0.5)としても、  
透過の無い黒でしかクリアされず、半透明の線が残ることはありません。

前フレームの色を透過させて残すことはできないでしょうか？

ご教授頂けると幸いです。  
どうぞよろしくお願い致します

[code]

    protected override void OnRenderFrame(FrameEventArgs e)
    {
            GL.ClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    
            GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
    
            GL.Begin(BeginMode.Lines);
    
            int N = dataset.Length;
            for (int n = 1; n < N; n++)
            {
                float v1 = dataset[n - 1];
                float v2 = dataset[n];
    
                Vector3 zero = 0.5f * (py - p0) + p0;
                Vector3 nx = px - p0;
    
                Vector3 P1 = zero + nx * (float)(n - 1) / N;
                Vector3 P2 = zero + nx * (float)n / N;
    
                Vector3 Value1 = v1 * (py - p0) * 0.5f;
                Vector3 Value2 = v2 * (py - p0) * 0.5f;
    
                P1 = P1 + Value1;
                P2 = P2 + Value2;
    
                GL.Color3(Color.Red);
                GL.Vertex3(P1);
                GL.Vertex3(P2);
    
            }
            GL.End();
    
            // SwapBuffer
            SwapBuffers();
        }
    
[/code]


CC BY-SA 4.0
2018-04-27T23:11:35.767
43621
2019-06-15T14:01:30.867
2018-05-03T13:57:40.170
3060
24920
question
c# opengl
OpenTK 半透過方法


質問をするときは最低限のマナーとして、まず環境に関する情報を詳しく書くようにしてください。  
OS、デバイスドライバー、IDE、SDK、ライブラリなどのバージョン、ハードウェアの型番など、提示すべき情報は多岐に渡ります。

[技術系メーリングリストで質問するときのパターン・ランゲージ](http://www.hyuki.com/writing/techask.html#env)

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++の情報を探したほうが早道です。


CC BY-SA 4.0
2018-05-03T13:19:43.643
43763
2018-05-04T19:26:29.480
2018-05-04T19:26:29.480
15413
15413
43621
answer