ページ 11

3次元軌跡の描画

Posted: 2013年2月04日(月) 14:16
by TOA
vc6.0, c++でopenGLを使い,立体が三次元空間を描画するプログラムを作成しています.

現在は,立体の動く軌跡を配列に格納し,
0~n番目の結果をすべて描画するようにしています.

しかし,この方法ではn番目の数が大きくなるほど
描画量が増えてしまうので,描画速度がだんだん落ちてしまいます.


そこで,前回の描画バッファを保存し,
そのバッファに次のデータを上書きするというような方法を考えているのですが,可能でしょうか?

ご教授よろしくお願いします.

Re: 3次元軌跡の描画

Posted: 2013年2月04日(月) 14:18
by TOA
×立体が三次元空間を描画
→立体が三次元空間を移動する軌跡を描画

Re: 3次元軌跡の描画

Posted: 2013年2月04日(月) 14:27
by softya(ソフト屋)
OpenGLには詳しくないですが、前回の描画バッファを残すと立方体も残ってしまうと思いますので、軌跡と立方体は別の描画バッファに描画したほうが良いと思います。
1.軌跡の描画バッファに軌跡を描画。バッファは毎回クリアしない。
2.立方体を表示する描画バッファに描画
3.軌跡バッファから表示する描画バッファに上書き(黒の部分は透明抜き)。

Re: 3次元軌跡の描画

Posted: 2013年2月04日(月) 15:55
by TOA
>>softya(ソフト屋)さん
返答ありがとうございます。

前回の描画バッファを残すと立方体も残ってしまう
→あえてそのバッファを残していき,動きの軌跡として表示しようとかんがえているのですが...
あまりよくない方法でしょうか?

Re: 3次元軌跡の描画

Posted: 2013年2月04日(月) 16:05
by softya(ソフト屋)
立方体が大きいと前の軌跡を上書きしてしまう可能性が高くなりますが、それは良いんですか?
あと立方体が見た目大きいと軌跡がわけわからなくなると思います。

【補足】
使っているのがglutならglClear()を止めるだけで実験できると思います。

Re: 3次元軌跡の描画

Posted: 2013年2月04日(月) 16:57
by ISLe
glutを使っているかどうかは関係なくて、ダブルバッファを使っているならシングルバッファに変更して、glClearからGL_COLOR_BUFFER_BITマスクを取り除けば良いのではないでしょうか。

いまはn個の立方体を描画しているということは軌跡も立体的に描画しているということなので、GL_DEPTH_BUFFER_BITマスクも取り除く必要がありますかね。

Re: 3次元軌跡の描画

Posted: 2013年2月06日(水) 10:27
by TOA
>> ISLeさん

現在の描画方法は以下のようにしてます.
メインのヘッダでメインのヘッダでHGLRCとCDC*を宣言しています.

コード:

        HGLRC m_hRC;
        CDC* m_pDC;

void ogl_init(){
  static int cnt = 0;

  if(cnt == 0){
   m_pDC = new CClientDC(this);
   m_pDC->m_hDC = m_ogl_view.GetDC()->GetSafeHdc();
   SetDCPixelFormat(m_pDC->m_hDC);
   m_hRC = wglCreateContext(m_pDC->m_hDC);
   wglMakeCurrent (m_pDC->m_hDC, m_hRC);
   cnt++;
  }
 
  //その他視野の設定など

}

void ogl_draw(){
 wglMakeCurrent (m_pDC->m_hDC, m_hRC);
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

//軌跡の描画など

 glFlush();
 SwapBuffers(m_pDC -> m_hDC);

}
main関数内でogl_init(),ogl_draw()を呼び出し,軌跡の描画を行っています.ogl_init()にglClearを移行しました.
ogl_init()内で,glutInitDisplayMode(GLUT_SINGLE)を宣言しましたが,うまくいきませんでした.
SwapBuffers(m_pDC -> m_hDC);が原因だとおもいますが,どうすればシングルバッファに切り替えられるでしょうか?
よろしくお願いします.

Re: 3次元軌跡の描画

Posted: 2013年2月06日(水) 16:52
by ISLe
wglなのですね。
SetDCPixelFormat関数内で、PIXELFORMATDESCRIPTOR構造体にPFD_DOUBLEBUFFERフラグを設定しているはずなのでそれを削除すればシングルバッファになると思います。

それだけだとウィンドウの再描画の際に不具合が出るかもしれません。
そうなったらオフスクリーンを使った描画が必要になります。
『OpenGL レンダリングターゲット』で検索するとオフスクリーン描画の方法が見付かります。

Re: 3次元軌跡の描画

Posted: 2013年2月06日(水) 18:35
by TOA
>> ISLeさん

おかげさまで解決しました.
有難うございました.