「큐브 그리기」 - OpenGL × GLFW3 × C++의 기억.

19111 단어 C++GLFWOpenGL
GLFW3를 사용하여 OpenGL 공부를 시작했기 때문에 비망록적인 것입니다.
덧붙여서 C++도 공부중입니다.
이 기사에 대한 츳코미는 환영합니다.

GLFW3의 함수에 대해 영어로 댓글을 달았지만 glfw3.h 파일 참조의 인용문입니다. 일본어의 코멘트는 제가 마음대로 해석하고 붙이고 있으므로, 잘못되어 있으면 츳코미 부탁합니다.

Cube



전회( Hello, OpenGL )의 계속입니다.
창에 다면체를 그립니다.
OpenGL의 각종 설정, 다면체의 데이터 구조는, 카피 프리라는 것이므로 GLUT에 의한 「손잡이」OpenGL 입문 로부터 카피 했습니다.

02-cube.cpp
#define GLFW_INCLUDE_GLU
#include <GLFW/glfw3.h>
#include <iostream>
#include <cstdlib>
#include <string>

static GLFWwindow*  aWindow;
static int          aWidth = 640;
static int          aHeight = 480;
static std::string  aTitle = "Cube";

// キューブの頂点情報。
static const GLdouble aCubeVertex[][3] = {
    { 0.0, 0.0, 0.0 },
    { 1.0, 0.0, 0.0 }, 
    { 1.0, 1.0, 0.0 }, 
    { 0.0, 1.0, 0.0 }, 
    { 0.0, 0.0, 1.0 }, 
    { 1.0, 0.0, 1.0 }, 
    { 1.0, 1.0, 1.0 }, 
    { 0.0, 1.0, 1.0 } 
};
// キューブの面。
static const int aCubeFace[][4] = {
    { 0, 1, 2, 3 },
    { 1, 5, 6, 2 },
    { 5, 4, 7, 6 },
    { 4, 0, 3, 7 },
    { 4, 5, 1, 0 },
    { 3, 2, 6, 7 }
};
// キューブに対する法線ベクトル。
static const GLdouble aCubeNormal[][3] = {
  { 0.0, 0.0,-1.0 },
  { 1.0, 0.0, 0.0 },
  { 0.0, 0.0, 1.0 },
  {-1.0, 0.0, 0.0 },
  { 0.0,-1.0, 0.0 },
  { 0.0, 1.0, 0.0 }
};
// キューブの材質。光源の色と合わせて陰影が少し青みがかって表示される。
static const GLfloat aCubeMaterial[] = { 0.8, 0.2, 0.2, 1.0 };
// 光源。
static const GLfloat aLightColor[] = { 0.2, 0.2, 0.8, 1.0 };// 光源の色。
static const GLfloat aLight0pos[] = { 0.0, 3.0, 5.0, 1.0 };// 光源0の位置。
static const GLfloat aLight1pos[] = { 5.0, 3.0, 0.0, 1.0 };// 光源1の位置。

// キューブを描画する関数。
static void drawCube();

int main()
{
    /* GLFW3の初期化 */
    if(! glfwInit() )
    {
        std::cerr << "glfwInit failed." << std::endl;
        exit( EXIT_FAILURE );
    }
    aWindow = glfwCreateWindow( aWidth, aHeight, aTitle.c_str(), nullptr, nullptr );
    if(! aWindow )
    {
        std::cerr << "glfwCreateWindow failed." << std::endl;
        glfwTerminate();
        exit( EXIT_FAILURE );
    }
    glfwMakeContextCurrent( aWindow );
    /* OpenGLの初期化  */
    glEnable( GL_DEPTH_TEST );// デプスバッファの有効化。
    glEnable( GL_CULL_FACE );// カリングの有効化。
    glEnable( GL_LIGHTING );// ライティングの有効化。
    glEnable( GL_LIGHT0 );// 光源0 を有効化。
    glEnable( GL_LIGHT1 );// 光源1 を有効化。
    glCullFace( GL_FRONT );// カリング。
    glLightfv( GL_LIGHT1, GL_DIFFUSE, aLightColor );// 光源1の色を設定。
    glLightfv( GL_LIGHT1, GL_SPECULAR, aLightColor );// 光源1の色を設定。
    glClearColor( 1, 1, 1, 1 );// glClear() で使用する色(RGBA)

    // メインループ。
    while(! glfwWindowShouldClose( aWindow ))
    {
        /* 初期化 */
        // 画面をクリア。
        glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
        // 変換行列の初期化。ここで初期化しないと延々と同じ行列に積算される。
        glLoadIdentity();

        /* 更新 */
        // 現在のウィンドウの大きさを取得。
        int width, height;
        glfwGetFramebufferSize( aWindow, &width, &height );
        // ビューポートの更新。
        glViewport( 0, 0, width, height );
        // 透視投影。
        gluPerspective( 30.0, (double)width / (double)height, 1.0, 100.0 );
        // 視点設定前の行列をすべて平行移動(視界に収める)。
        glTranslated( 0.0, 0.0, -2.0 );
        // 視点の設定。
        gluLookAt( 3.0, 4.0, 5.0,  0.0, 0.0, 0.0,  0.0, 1.0, 0.0 );
        // 光源の位置設定 (*重要 視点の位置を設定した後に行う) 
        glLightfv( GL_LIGHT0, GL_POSITION, aLight0pos );
        glLightfv( GL_LIGHT1, GL_POSITION, aLight1pos );

        /* 描画 */
        drawCube();

        /* ダブルバッファのスワップとイベントのポーリング */
        glfwSwapBuffers( aWindow );
        glfwPollEvents();
    }
    // GLFW3 の終了。
    glfwTerminate();
    return EXIT_SUCCESS;
}

static void drawCube()
{
    // キューブの材質パラメータを設定。
    glMaterialfv( GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, aCubeMaterial );
    // キューブの頂点を描画。
    glBegin( GL_QUADS );
    for (size_t i = 0; i < 6; ++i)
    {
        glNormal3dv( aCubeNormal[i] );// 法線ベクトルをキューブに当てる。
        for (size_t j = 0; j < 4; ++j)
        {
            glVertex3dv( aCubeVertex[ aCubeFace[i][j] ] );
        }
    }
    glEnd();
}

빌드 및 실행 결과
$ g++ -std=gnu++11 -Wall 02-cube.cpp -lglfw -lGLU
$ ./a.out

좋은 웹페이지 즐겨찾기