5

私はこれを読んだ:

「OpenGLは、標準のマトリックススタック(GL_MODELVIEWおよびGL_PROJECTION)を使用して座標変換と投影を管理するためのサポートを提供しました。ただし、コアOpenGL 4.0では、マトリックススタックをサポートするすべての機能が削除されました。したがって、通常の変換および射影行列を独自にサポートし、それらをシェーダーに渡します。」

これは奇妙なことですが、モデルビューと投影行列を今すぐ設定するにはどうすればよいですか?openglアプリでそれらを作成してから、頂点シェーダーの頂点に行列を掛ける必要がありますか?

4

2 に答える 2

12

これは奇妙です

いいえ。修正された機能は、必要に応じて変換を設計できるプログラム可能なパイプラインに置き換えられました。

openglアプリでそれらを作成してから、頂点シェーダーの頂点に行列を掛ける必要がありますか?

マトリックススタックの古いOpenGLペアと同じように機能するものが必要な場合は、たとえば、頂点シェーダーを次のように表示する必要があります。

in vec4 vertexPosition; 
// ...

uniform mat4 ModelView, Projection;

void main() {
    gl_Position = Projection * ModelView * vertexPosition;
    // ...
}

(もちろん、それを少し最適化することができます)

そして、対応するクライアントサイズのコード(ここではC ++として示されています)は次のようになります。

std::stack<Matrix4x4> modelViewStack;
std::stack<Matrix4x4> projectionStack;

// Initialize them by
modelViewStack.push(Matrix4x4.Identity());
projectionStack.push(Matrix4x4.Identity());

// glPushMatrix:
stack.push(stack.top());
    // `stack` is either one stack or the other;
    // in old OpenGL you switched the affected stack by glMatrixMode

// glPopMatrix:
stack.pop();

// glTranslate and family:
stack.top().translate(1,0,0);

// And in order to pass the topmost ModelView matrix to a shader program:
GLint modelViewLocation = glGetUniformLocation(aLinkedProgramObject,
                                               "ModelView");
glUniformMatrix4fv(modelViewLocation, 1, false, &modelViewStack.top());

ここでは、のような操作をサポートするMatrix4x4クラスがあると仮定しました.translate()GLMのようなライブラリは、対応するGLSLタイプのように動作する行列とベクトルのクライアント側の実装、およびのような関数の実装を提供できますgluPerspective


OpenGL互換性プロファイルを介してOpenGL1機能を引き続き使用することもできますが、これはお勧めしません(OpenGLの可能性を最大限に活用することはできません)。

OpenGL 3(および4)のインターフェイスは、OpenGL1よりも低レベルです。上記のコードが多すぎると考える場合は、Irrlichtなどのレンダリングエンジンを使用したほうがよい可能性があります。

于 2012-11-30T14:45:04.677 に答える
6

マトリックススタックは、非推奨の固定関数パイプラインの一部です。互換性拡張機能を介して古い機能にアクセスすることはできますが、これは避けてください。

マトリックスとカメラに関するいくつかの良いチュートリアルがありますが、私はこれを好みます。マトリックスをシェーダーに送信し、あなたが言ったように、頂点にマトリックスを掛けます。

于 2012-11-30T14:39:45.233 に答える