OpenGL


Overview:

OpenGL is OpenGL.


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 );