「큐브 그리기」 - OpenGL × GLFW3 × C++의 기억.
덧붙여서 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
Reference
이 문제에 관하여(「큐브 그리기」 - OpenGL × GLFW3 × C++의 기억.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/narupo/items/0f24ad84141ce68fa757
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
#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
Reference
이 문제에 관하여(「큐브 그리기」 - OpenGL × GLFW3 × C++의 기억.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/narupo/items/0f24ad84141ce68fa757텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)