1

時間を節約するために、OpenGLでオブジェクトを再度描画せずに回転させたい。initメソッドでは、絵を描き、マウスイベントに応じて回転させるだけです。

完全な方法は次のとおりです。

 gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);
 gl.LoadIdentity();     
 gl.Rotate(camera_angle_v, 1.0f, 0.0, 0.0);
 gl.Begin(OpenGL.GL_POINTS);

 //Draw

 gl.End();
4

3 に答える 3

3

OpenGL は基本的にこのようには機能しません。レンダリングしているフレームは、基本的にピクセルの 2 次元配列です。画像を描画すると、それらのピクセルの一部の値が変更され、画像が作成されます。何かが描かれると、それをクリアするまでそこにとどまります。OpenGL は、過去にレンダリングしたものを追跡しないため (フレームを塗りつぶすピクセルを除く)、現在レンダリングしている三角形/線以外の変換を行うことはできません。

draw メソッドの開始時に、フレームをクリアします (すべてのピクセルをクリア カラーにリセットします)。その後、オブジェクトを再描画する必要があります。これが OpenGL の仕組みであり、非常に高速です。最新の GPU では、フレームごとに何百万もの三角形を描画しても、60fps を維持できます。最初にフレームをクリアしないと、古いフレームの上に画像が描画され、鏡のホールのような効果が得られます。

パフォーマンスが問題になる場合は、より最新の OpenGL を学習することを検討してください。現在使用しているのは、1992 年に OpenGL 1.0 仕様の一部であったイミディエイト モード OpenGL です。1997 年に OpenGL 1.1 で頂点配列が導入されました。これにより、メソッド呼び出しが 1 つしかないため、大量の頂点の速度が大幅に向上します。頂点ごとに 1 つのメソッドを呼び出すのではなく、すべての頂点に対して。そして、OpenGL の新しいバージョンごとに、より最適化された描画方法が提供されます。

于 2012-07-21T21:51:11.313 に答える
1

オブジェクトをもう一度描画する必要があります - それが OpenGL の仕組みです。

各フレームは、現在のシーン ジオメトリに基づいてゼロからレンダリングされます。

于 2012-07-21T21:50:29.033 に答える
0

うーん...即時モードを使用している場合は、表示リストを使用して、それに応じてglRotateを呼び出すことができると思います。Robert Rouhani が言ったように、あなたが使っているテクニックは古いものです (オンライン チュートリアルの 99% が教えてくれます)。オブジェクトを描画するには、VAO (またはさらに良い場合は VBO) を使用します。

于 2012-07-22T01:48:52.893 に答える