私はOpenGLとOpenGL ESを長い間使用しており、それらをかなりよく知っています。また、使用するのが非常に面倒であり、これがどこで議論されているのか、私は実際に見たことがありません。ここに私が気づいた悪いデザインのいくつかの例があります:
これらすべて、および他の多くの欠陥により、OpenGLは問題ないようです。それは非常に人気があり、モバイルデバイスを支配し、活発な開発が行われており、あらゆる種類のGPUでサポートされています。どうして?なぜこれがすべて許容されるのか、そして最も重要なのはなぜこのように設計されたのか? GPUは非常に特殊なデバイスであり、CPU、GPU、メモリなどの間の通信には一定の制約が必要であることは知っていますが、ほとんどの場合、回避できる設計の誤りが原因であるようです。
それは非常に人気があり、モバイルデバイスを支配し、活発な開発が行われており、あらゆる種類のGPUでサポートされています。どうして?
さて...あなたの代わりは何ですか?
Vulkanを無視して、モバイルデバイス用のクロスプラットフォームアプリケーションを作成し、ハードウェア3Dを使用したい場合、正確に何を使用しますかexceptOpenGL ES?
OpenGLが賢明でよく設計されたAPIであると(少なくとも最近は)誰も主張していません。しかしそれは機能します;それは仕事を成し遂げ、広く利用可能なクロスプラットフォームの代替手段はもうありません。
そして、いくつかの事実確認のために:
エラーの「スロット」は1つしかないので、すべての関数の後でチェックしないと、チェックの前にエラーが複数あるとエラーが失われるため、関数の最後まで正しく到達することはありません。
それは誤りです。 OpenGLのエラーはqueuedです。 glGetError
を呼び出すたびに、キューに最後に追加されたエラーが返されます 。 OpenGLエラーはOpenGLで失われません。
妥当な頻度でエラーをチェックしないことの問題は、チェックしないと、どの関数がどのエラーの原因であるかを知ることが難しいことです。
glTexImage2Dのborder = 0など
これは、GL 3.1より前のテクスチャがボーダーテクセルを持つ可能性があるために存在します。しかし、コンシューマーグレードのハードウェアはボーダーテクセルをサポートしていないため、3.1でコアOpenGLから削除されました。ただし、関数からパラメーターを単に削除することはできません。それはあちこちでABIを壊します。したがって、彼らは最小の抵抗の経路をたどりました:パラメータを保持しますが、それがゼロであることを要求しました。
ESは、デスクトップOpenGLとのAPI互換性を維持するためにそれを保持しました。
一般に、OpenGL APIのほとんどすべての煩わしさは、最終的にはある程度の「下位互換性があるため」になります。
コンパイル時にあらゆる種類のエラーをチェックすることは絶対にありません
OpenGLはC APIです。 Cには、コンパイル時の検証を行う余地があまりありません。