OpenGLで非推奨になったもの

opengl-deprecated.png

非推奨になったもの

fixed-function vertex processing

頂点配列関係

頂点配列

  • glColorPointer
  • glEdgeFlagPointer
  • glFragCoordPointer
  • glIndexPointer
  • glNormalPointer
  • glSecondaryColorPointer
  • glTexCoordPointer
  • glVertexPointer
  • glEnableClientState
  • glDisableClientState
  • glClientActiveTexture
  • glEnable(GL_RESCALE_NORMAL)
  • glEnable(GL_NORMALIZE)
  • glTexGen
  • glEnable(GL_TEX_GEN_*)
  • glMaterial
  • glLight
  • glLightModel
  • glColorMaterial
  • glFrontFace
  • glClampColor
  • glShadeModel

行列演算関係

  • glFrustum
  • glLoadIdentity
  • glLoadMatrix
  • glLoadTransposeMatrix
  • glMatrixMode
  • glMultiMatrix
  • glMultTransposeMatrix
  • glOrtho
  • glPopMatrix
  • glPushMatrix
  • glRotate
  • glScale
  • glTranslate

これらはすべて、OpenGLの数学ライブラリglmで代用可能です。
それか、なるべく頂点シェーダで処理しましょうってことかな

glMutrixModeの代替

GLuint matrixLocation = glGetUniformLocation(mProgram, "uModelViewProj");
glUniformMatrix4fv(matrixLocation, 1, GL_FALSE, &m_modelview_proj_matrix[0][0]);//glm::mat4で計算したものをシェーダに渡す

頂点シェーダにて
#version 400
uniform mat4 uModelViewProj;//ユニフォーム変数で行列を渡す
in vec3 vp;
void main () {
  gl_Position = uModelViewProj * vec4(vp, 1.0);//ここで行列掛け算する
}

fixed-function fragment processing

glTexEnv
- AreTexturesResident, PrioritizeTextures,
and glTexParameter target TEXTURE PRIORITY;
glTexEnv target
TEXTURE ENV and all associated parameters;
Enable targets of all dimensionalities
(TEXTURE 1D, TEXTURE 2D, TEXTURE 3D, TEXTURE 1D ARRAY,
TEXTURE 2D ARRAY, and TEXTURE CUBE MAP);
Enable target COLOR SUM;
Enable target FOG, Fog, and all associated parameters; and all associated
state.

Application-generated object names

buffer, query, テクスチャオブジェクトなど名前を持つオブジェクトは対応するglGenコマンドで生成されなければならない。
glGenで生成されていないオブジェクトでglBindしようとするとINVALID_OPERATIONエラーを返します。
後から登場したframebuffer, renderbuffer,vertex array objectsでは既にそういう仕様になっています。

  • Edge flags

Client-side vertex arrays

すべての頂点配列属性ポインタは頂点バッファオブジェクトに関連付けないといけません。
glVertexAttribPointerバッファーオブジェクトなしに呼ぼうとするとINVALID_OPERATIONエラーになります。

Wide lines and line stripple

glLineWidthで1.0以上の太さの線を指定するとINVALID_VALUEエラーになります。
太い線を表現したかったら、ポリゴン化した線をTRIANGLE_STRIPなどで描画しましょう->線からTRIANGLE_STRIPにする

  • glLineStipple….破線です。代わりにポリゴン化したシェーダとフラグメントシェーダで破線を表現するのがおすすめ。
  • glEnable(GL_LINESTIPPLE)

それにデフォルトでポイントスプライトが効くようになったので、線を太くする必要なし

Separate polygon draw mode

ワイヤーフレームにしたいとき、今まではこうしてました

glPolygonMode(GL_FRONT,GL_LINE);
glPolygonMode(GL_BACK,GL_LINE);

ポリゴンモードの面の値、GL_FRONTGL_BACKが非推奨になりました。
ポリゴンは、どっちの面がラスタライズされるにしろ、常に同じモードで描画されるようになりました。
なので代わりにこうやって書きます
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);

簡単にワイヤーフレーム表示する方法(OpenGL)
  • Polygon stripple
  • Pixel transfer modes and operations
  • Pixel drawing
  • Bitmaps
  • Legacy OpenGL 1.0 pixel formats
  • Legacy pixel formats
  • Depth texture mode
  • Texture wrap mode CLAMP
  • Texture borders

Automatic mipmap generation

GL_GENERATE MIPMAP

  • Fixed function fragment processing
  • Alpha test
  • auxiliary buffers
  • Context framebuffer size queries
  • Selection and feedback mode

Hints

the PERSPECTIVE CORRECTION HINT, FOG HINT, and
GENERATE MIPMAP HINT targets to Hint

  • Attribute stacks
  • Unified extension string

非推奨になった関数を検出する方法

コアプロファイルを指定する

//OpenGL Version 4.5 Core Profile を選択する
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 5);
    //前方互換プロファイル、古い機能を使えなくする
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, true);
    //OpenGLのプロファイルをコアプロファイルに指定する。
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

これをやってglBeginとか書いてかつglGetErrorすると、エラーが返ってくるようになります

たとえば

after GetShaderInfoLog 無効な列挙

opengl-profile

目視で確認!?

OpenGLのリファレンスで載ってなければ非推奨になっています

gDebuggerを使った方法

やり方
Locating fully deprecated functions with gDEBugger is quite simple: run your application in gDEBugger (either in Debug or Analyze Modes), and open the Statistics viewer's Deprecated Function Statistics view. All the fully deprecated functions will be marked as such. You can add breakpoints to make gDEBugger suspend the debugged process run whenever one of these functions is hit and easily find the location of the call.
deprecated.PNG
対象の.exeで使用している非推奨な関数をリストアップしてくれます
deprecated-sample.PNG
ひぇー超いっぱい!
Bibliography

deprecated

サポートサイト Wikidot.com deprecated