3

現在の変換行列を (スタックにプッシュするのではなく) 特定の場所に格納し、特定の場所から行列をロードするように OpenGL に指示することは可能ですか?

私は、ビデオ デバイスとメイン メモリの間で追加のデータ転送を必要としないソリューションを好みます (つまり、行列をビデオ メモリのどこかに保存する方がよい)。

4

2 に答える 2

9

あなたの質問の最初の部分に答えるには:

関数glLoadMatrixとglGetはそれを行うことができます

// get current model view matrix
double matrix[16];
glGetDoublev(GL_MODELVIEW_MATRIX, matrix)

// manipulate matrix

glLoadMatrixd(matrix);

これらの機能は、OpenGL4ではサポートされなくなったことに注意してください。マトリックス操作は、とにかくアプリケーションサイトで実行し、シェーダープログラムに統一変数として提供する必要があります。

于 2012-11-11T11:28:06.993 に答える
3

古い固定関数パイプラインでは、行列はオンデマンドでいくつかの特別な GPU レジスタにロードされましたが、VRAM には決してロードされず、すべての行列計算は CPU で行われました。現代の OpenGL 行列計算は依然として CPU 上で行われ (そしてそうです)、オンデマンドで再び「Uniforms」と呼ばれるレジスタにロードされます。ただし、最新の OpenGL には、VRAM からユニフォーム (レジスタ) 値をロードできる「ユニフォーム バッファ オブジェクト」と呼ばれる機能もあります。http://www.opengl.org/wiki/Uniform_Buffer_Object

しかし、変換行列の保存にはほとんど役に立ちません。まず、アニメーションを実行するためにそれらを定期的に変更します。第 2 に、単純なマトリックスの UBO を管理するオーバーヘッドは、CPU から設定するよりもはるかに多くのパフォーマンスを消費します。マトリックスは 16 個のスカラー、または位置、法線、テクスチャ座標、接線属性を持つ 1 つの頂点に相当します。

于 2012-11-11T12:15:59.193 に答える