OpenGLの使用

7243 ワード

OpenGLの使用
OpenGL API呼び出し、OpenGLコマンドバッファ、変換および光照射、ラスタリング、フレームバッファ.
多くのプラットフォームにおいて、OpenGL関数ライブラリは、Windowsにおいてglu 32に位置するOpenGLツールライブラリ(GLU)によって実現される.dll、Windowsシステムディレクトリにあります.すべてのプラットフォームにおいて、すべてのOpenGL関数、タイプ、マクロのプロトタイプがヘッダファイルglに含まれることが約束されている.h中.ライブラリ関数のプロトタイプは別のヘッダファイルgluに表示されます.h中.
  32ビット環境において、OpenGLデータ型に対応するC/C++データ型および正しい字面値接尾辞.
OpenGLデータ型
内部表示形式
対応するCデータ型
C字面値接尾辞
GLbyte
8ビット整数
signed char
b
GLshort
16ビット整数
short
s
GLint,GLsizei
32ビット整数
long
i
GLfloat,GLclampf
32ビット浮動小数点数
float
f
GLdouble,GLclampd
64ビット浮動小数点数
double
d
GLubyte,GLboolean
8ビット符号なし整数
unsigned char
ub
GLushort
16ビット符号なし整数
unsigned short
us
GLuint,GLenum,GLbitfield
32ビット符号なし整数
unsigned long
ui
GLchar
8ビット文字
char
なし
GLsizeiptr,GLintptr
ローカルポインタ
ptrdiff_t
なし
  OpenGL関数の命名形式は一般的に以下の通りである.
<     ><   ><       ><       >

 OpenGL座標系.OpenGLは右手座標系システムを用い,座標原点は画面の中心点である.スクリーンx軸に向かって正方向右,y軸正方向上,z軸正方向を視者に向ける.プログラムが初期化されたばかりのとき、描画座標系は世界座標系と重なり、glTranslatef()、glScalef()、glRotatef()を使用して現在の描画座標系を平行移動、伸縮、回転変換することができます.
 OpenGL RGBカラーチャネル格納順序RGB,OpenCV BGR.
簡単な例:
#include <glutdlls37beta\glut.h>

GLfloat x1 = 0.0f;
GLfloat y1 = 0.0f;
GLfloat rsize = 25;

GLfloat xstep = 1.0f;
GLfloat ystep = 1.0f;

//            
GLfloat windowWidth;
GLfloat windowHeight;

//    
void renderScene(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0f, 0.0f, 0.0f);
    glRectf(x1, y1, x1 + rsize, y1 - rsize);
    glutSwapBuffers(); //           。
}

void setupRenderColor()
{
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
}

void changeSize(GLsizei w, GLsizei h)
{
    if (h == 0)
        h = 1.0f;

    glViewport(0, 0, w, h);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    GLfloat aspectRation = (GLfloat)w / (GLfloat)h;
    if (w <= h)
    {
        windowWidth = 100;
        windowHeight = 100 / aspectRation;
        glOrtho(-100.0, 100.0, -100.0 / aspectRation, 100.0 / aspectRation, 1.0, -1.0);
    }
    else
    {
        windowWidth = 100 * aspectRation;
        windowHeight = 100;
        glOrtho(-100.0 * aspectRation, 100.0 * aspectRation, -100.0, 100.0, 1.0, -1.0);
    }
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

void timerFunction(int value)
{
    if (x1 > windowWidth - rsize || x1 < -windowWidth)
        xstep = -xstep;
    if (y1 > windowHeight || y1 < -windowHeight + rsize)
        ystep = -ystep;

    x1 += xstep;
    y1 += ystep;

    if (x1 >(windowWidth - rsize + xstep))
        x1 = windowWidth - rsize - 1;
    else if (x1 < -(windowWidth + xstep))
        x1 = -windowWidth - 1;

    if (y1 >(windowHeight + ystep))
        y1 = windowHeight - 1;
    else if (y1 < -(windowHeight - rsize + ystep))
        y1 = -windowHeight + rsize - 1;


    glutPostRedisplay();
    glutTimerFunc(33, timerFunction, 1);
}

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(800, 600);
    glutCreateWindow("Bounce");
    glutDisplayFunc(renderScene);
    glutReshapeFunc(changeSize);
    glutTimerFunc(33, timerFunction, 1);

    setupRenderColor();

    glutMainLoop();

    return 0;
}

注:glutの含むパス、ライブラリパス、および追加の依存項目をプロジェクトで構成し、動的リンクライブラリをプロジェクトに対応する実行可能ファイルディレクトリにコピーします.
  OpenGL状態機
//      
void glEnable(GLenum capability);
//      
void glDisable(GLenum capability);
//        
GLboolean glIsEnabled(GLenum capability);
//        
void glGetBooleanv(GLenum pname, GLboolean *params);
void glGetDoublev(GLenum pname, GLdouble *params);
void glGetFloatv(GLenum pname, GLfloat *params);
void glGetIntegerv(GLenum pname, GLInteger *params);
// OpenGL                
void glPushAttrib(GLbitfield mask);
//              
void glPopAttrib(GLbitfield mask); 

参考資料1.OpenGL SuperBible 2. OpenGL座標系