これは奇妙です
いいえ。修正された機能は、必要に応じて変換を設計できるプログラム可能なパイプラインに置き換えられました。
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などのレンダリングエンジンを使用したほうがよい可能性があります。