vc6.0, c++でopenGLを使い,立体が三次元空間を描画するプログラムを作成しています.
現在は,立体の動く軌跡を配列に格納し,
0~n番目の結果をすべて描画するようにしています.
しかし,この方法ではn番目の数が大きくなるほど
描画量が増えてしまうので,描画速度がだんだん落ちてしまいます.
そこで,前回の描画バッファを保存し,
そのバッファに次のデータを上書きするというような方法を考えているのですが,可能でしょうか?
ご教授よろしくお願いします.
3次元軌跡の描画
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 3次元軌跡の描画
OpenGLには詳しくないですが、前回の描画バッファを残すと立方体も残ってしまうと思いますので、軌跡と立方体は別の描画バッファに描画したほうが良いと思います。
1.軌跡の描画バッファに軌跡を描画。バッファは毎回クリアしない。
2.立方体を表示する描画バッファに描画
3.軌跡バッファから表示する描画バッファに上書き(黒の部分は透明抜き)。
1.軌跡の描画バッファに軌跡を描画。バッファは毎回クリアしない。
2.立方体を表示する描画バッファに描画
3.軌跡バッファから表示する描画バッファに上書き(黒の部分は透明抜き)。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
TOA
Re: 3次元軌跡の描画
>>softya(ソフト屋)さん
返答ありがとうございます。
前回の描画バッファを残すと立方体も残ってしまう
→あえてそのバッファを残していき,動きの軌跡として表示しようとかんがえているのですが...
あまりよくない方法でしょうか?
返答ありがとうございます。
前回の描画バッファを残すと立方体も残ってしまう
→あえてそのバッファを残していき,動きの軌跡として表示しようとかんがえているのですが...
あまりよくない方法でしょうか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 3次元軌跡の描画
立方体が大きいと前の軌跡を上書きしてしまう可能性が高くなりますが、それは良いんですか?
あと立方体が見た目大きいと軌跡がわけわからなくなると思います。
【補足】
使っているのがglutならglClear()を止めるだけで実験できると思います。
あと立方体が見た目大きいと軌跡がわけわからなくなると思います。
【補足】
使っているのがglutならglClear()を止めるだけで実験できると思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 3次元軌跡の描画
glutを使っているかどうかは関係なくて、ダブルバッファを使っているならシングルバッファに変更して、glClearからGL_COLOR_BUFFER_BITマスクを取り除けば良いのではないでしょうか。
いまはn個の立方体を描画しているということは軌跡も立体的に描画しているということなので、GL_DEPTH_BUFFER_BITマスクも取り除く必要がありますかね。
いまはn個の立方体を描画しているということは軌跡も立体的に描画しているということなので、GL_DEPTH_BUFFER_BITマスクも取り除く必要がありますかね。
-
TOA
Re: 3次元軌跡の描画
>> ISLeさん
現在の描画方法は以下のようにしてます.
メインのヘッダでメインのヘッダでHGLRCとCDC*を宣言しています.
main関数内でogl_init(),ogl_draw()を呼び出し,軌跡の描画を行っています.ogl_init()にglClearを移行しました.
ogl_init()内で,glutInitDisplayMode(GLUT_SINGLE)を宣言しましたが,うまくいきませんでした.
SwapBuffers(m_pDC -> m_hDC);が原因だとおもいますが,どうすればシングルバッファに切り替えられるでしょうか?
よろしくお願いします.
現在の描画方法は以下のようにしてます.
メインのヘッダでメインのヘッダで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);
}
ogl_init()内で,glutInitDisplayMode(GLUT_SINGLE)を宣言しましたが,うまくいきませんでした.
SwapBuffers(m_pDC -> m_hDC);が原因だとおもいますが,どうすればシングルバッファに切り替えられるでしょうか?
よろしくお願いします.
Re: 3次元軌跡の描画
wglなのですね。
SetDCPixelFormat関数内で、PIXELFORMATDESCRIPTOR構造体にPFD_DOUBLEBUFFERフラグを設定しているはずなのでそれを削除すればシングルバッファになると思います。
それだけだとウィンドウの再描画の際に不具合が出るかもしれません。
そうなったらオフスクリーンを使った描画が必要になります。
『OpenGL レンダリングターゲット』で検索するとオフスクリーン描画の方法が見付かります。
SetDCPixelFormat関数内で、PIXELFORMATDESCRIPTOR構造体にPFD_DOUBLEBUFFERフラグを設定しているはずなのでそれを削除すればシングルバッファになると思います。
それだけだとウィンドウの再描画の際に不具合が出るかもしれません。
そうなったらオフスクリーンを使った描画が必要になります。
『OpenGL レンダリングターゲット』で検索するとオフスクリーン描画の方法が見付かります。