OpenGL
Overview:
Install:
NuGet: nupengl.core
座標:
Opengl: 右手座標系(中指奥) DirectX: 左手座標系(中指手前) y│ /-z │ / │/ │ ────┼──── -x /│ x / │ / │ z/ │-y gluLookAt (0.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, 1.0, 0.0); # default (原点から-z方向) # クリップ座標系では z 軸の方向が反転される glOrtho(0, width, 0, height, 0, 100); glOrtho(0, width, 0, height, -99, 1);
変換行列の設定:
void glMatrixMode(GLenum mode) void glLoadIdentity(void) GL_MODELVIEW # モデルビュー行列 GL_PROJECTION # 射影行列 GL_TEXTURE # テクスチャ行列 頂点情報 モデルビュー変換 モデリング変換 # 移動、回転、拡縮 視界変換 # 視点とモデルの関係 射影変換 # 3D -> 2D ビューポート変換 # 2D -> Screen 描画 ワールド座標系 正規化デバイス座標系(クリッピング座標系) デバイス座標系 (ディスプレイ上の座標系)
ビューの設定:
Resize(int w, int h) glViewport(0, 0, w, h); # 正射影 glOrtho(-w/200.0, w/200.0, -h/200.0, h/200.0, -1.0f, 1.0f); # left/right/bottom/top/near/far # 透視法射影 void gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble near, GLdouble far) void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far) void gluLookAt(GLdouble ex, GLdouble ey, GLdouble ez, GLdouble cx, GLdouble cy, GLdouble cz, GLdouble ux, GLdouble uy, GLdouble uz) gluLookAt (0.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, 1.0, 0.0); # default
ライトの設定:
void glLightfv(GLenum light, GLenum pname, const GLfloat *params) Init() glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDiffuse); glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmbient); glLightfv(GL_LIGHT0, GL_SPECULAR, lightSpecular); Display() glLightfv(GL_LIGHT0, GL_POSITION, lightPosition); // ライト位置 GL_POSITION # 光源の位置 (w:0.0f 無限遠、w:1.0f 等倍) GL_DIFFUSE # 光源の拡散反射光強度 (色) GL_AMBIENT # 環境光 GL_SPECULAR # 鏡面反射
マテリアルの設定:
void glMaterialfv(GLenum face, GLenum pname, const GLfloat *params) glMaterialfv(GL_FRONT, GL_AMBIENT, colModel) GL_FRONT # 表 GL_BACK # 裏 GL_FRONT_AND_BACK # 両面 GL_AMBIENT # 環境光に対する反射係数 GL_DIFFUSE # 拡散反射係数 GL_SPECULAR # 鏡面反射係数 GL_EMISSION # 発光係数 GL_SHININESS # ハイライトの輝き GL_AMBIENT_AND_DIFFUSE # 拡散反射係数と鏡面反射係数の両方
描画:
void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid * indices) GL_POINTS GL_LINE_STRIP GL_LINE_LOOP GL_LINES GL_LINE_STRIP_ADJACENCY GL_LINES_ADJACENCY GL_TRIANGLE_STRIP GL_TRIANGLE_FAN GL_TRIANGLES GL_TRIANGLE_STRIP_ADJACENCY GL_TRIANGLES_ADJACENCY GL_PATCHES GL_UNSIGNED_BYTE GL_UNSIGNED_SHORT GL_UNSIGNED_INT 命令名 size type glVertexPointer(size, type, stride, pointer) 2,3,4 GL_SHORT, GL_INT, GL_FLOAT, GL_DOUBLE glColorPointer(size, type, stride, pointer) 3,4 GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, GL_INT, GL_UNSIGNED_INT, GL_FLOAT, GL_DOUBLE glSecondaryColorPointer(size, type, stride, pointer) 3 同上 glIndexPointer(type, stride, pointer) 1 GL_UNSIGNED_BYTE, GL_SHORT, GL_INT, GL_FLOAT, GL_DOUBLE glNormalPointer(type, stride, pointer) 3 GL_BYTE, GL_SHORT, GL_INT, GL_FLOAT, GL_DOUBLE glFogCoordPointer(type, stride, pointer) 1 GL_FLOAT, GL_DOUBLE glTexCoordPointer(size, type, stride, pointer) 1,2,3,4 GL_SHORT, GL_INT, GL_FLOAT, GL_DOUBLE glEdgeFlagPointer(stride, pointer) 1 - GLfloat col_and_vert[] = { 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 5.0, 5.0, 0.0 }; glInterleavedArrays(GL_C3F_V3F, 0, col_and_vert); glDrawArrays(GL_TRIANGLES, 0, 3); glShadeModel(GL10.GL_SMOOTH); 陰影処理を設定するメソッド。 GL_SMOOTH スムースシューティングの場合、ポリゴンの陰影が滑らかの表現され描画される。 GL_FLAT フラットシューティングに設定した場合、面ごとの明るさが一定の状態として描画される。高速描画が可能。 // 頂点ごとに頂点法線を指定する。 glNormal3fv( normanl1 ); // 頂点法線を指定。 glVertex3fv( vertex1 ); // 頂点を指定。 glNormal3fv( normanl2 ); glVertex3fv( vertex2 ); glNormal3fv( normanl3 ); glVertex3fv( vertex3 ); glNormal3fv( normanl4 ); glVertex3fv( vertex4 ); // 面ごとに面法線を指定する。 glNormal3fv( faceNormal1 ); // 面法線を指定。 glVertex3fv( vertex1 ); // 頂点を指定。 glVertex3fv( vertex2 ); glVertex3fv( vertex3 ); glVertex3fv( vertex4 );