ゲームグラフィックス特論 第1回 講義ノート
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

ゲームグラフィックス特論 第1回 講義ノート

on

  • 4,910 views

 

Statistics

Views

Total Views
4,910
Views on SlideShare
4,240
Embed Views
670

Actions

Likes
18
Downloads
136
Comments
0

3 Embeds 670

https://twitter.com 627
http://inoook.tumblr.com 42
http://feedly.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

ゲームグラフィックス特論 第1回 講義ノート Document Transcript

  • 1. 1 1 1.1 1.1.1 (3DCG) 3D OpenGL GLSL (OpenGL Shading Language) 1.1.2 3D 3DCG 1.1.3 : 0 : 2 : 3 : 4 ( ): 5 40% 60%
  • 2. 2 1.2 1.2.1 3DCG (CG) CG CG CG ( ) CG 3DCG 1.2.2 3DCG 3DCG 3DCG 3DCG 3DCG CG 3DCG
  • 3. 3 1.2.3 3DCG 3DCG 3DCG CAD ( ) CAE ( ) 3DCG 3DCG 3DCG CG Sutherland Sketchpad (interaction) CG CG 1.3 3DCG 1.3.1 CG 3DCG AR ( ) GPU (Graphics Processing Unit) GPGPU (General Purpose GPU) 1.3.2 3DCG ( 1)
  • 4. 4 1 CG 1.3.3 CG ( ) ! ! ! ! ! ! ! / ! / ! ( ) •  •  •  •  API
  • 5. 5 1.4 OpenGL CPU (OS) (API) OS Microsoft Windows Graphics Device Interface (GDI) 3DCG DirectX ( 3DCG Direct3D) API Windows OpenGL API OpenGL Microsoft DirectX Windows 3DCG API OpenGL Silicon Graphics ( SGI ) API IRIX UNIX OS (EWS) OpenGL EWS ( GL OpenGL IRIS GL ) ( OS ) EWS CAD EWS Windows OpenGL OS Windows DirectX OpenGL DirectX Microsoft OS Windows OpenGL Windows 3DCG API OpenGL ( OpenGL ES) OpenGL OpenGL OpenGL Apple OS Mac OS X UNIX Linux X Window System OpenGL OS Apple iOS Google Android OpenGL ES
  • 6. 6 1.5 GLFW 1.5.1 OpenGL OpenGL API GLUT (OpenGL Utility Toolkit) OpenGL Silicon Graphics ( ) GLUT Unix / Linux Windows Mac OS X GLUT OpenGL OpenGL OpenGL GLUT GLUT freeglut OpenGLUT Mac OS X Mac OS X GLUT OpenGL 2.1 Mac OS X 10.7 (Lion) OpenGL 3.2 Core Profile 10.9 (Mavericks) OpenGL 4.1 ( ) 10.9 GLUT 1.5.2 GLFW OpenGL GLUT FLTK Qt SDL Qt 3DCG OpenGL Qt GLUT GLFW GLFW (http://www.glfw.org/) GLFW OpenGL ( ) zlib/libpng license 1 1.5.3 GLFW GLFW " GLUT Windows / Mac OS X / Linux 1 GLFW Marcus Geelnard Camilla Berglund
  • 7. 7 " OpenGL Mac OS X 10.7 (Lion) OpenGL 3.2 Core Profile " GLUT " " GLUT " GLUT ( ) ( ) Mac OS X GLUT " GLFW GLUT GLFW Cube Sphere Teapot GLFW GLUT GLUT GLFW OpenGL Core Profile Mac OS X GLUT OpenGL Legacy Profile OpenGL 2.1 " GLFW Reference User Guide
  • 8. 8 2 2.1 2.1.1 ( 2) (Bresenham ) ( 3)
  • 9. 9 2 3 アプリケーション (やりたいこと) ハードウェア (やれること) アプリケーション (やりたいこと) ハードウェア (やれること) アルゴリズム セマンティック ギャップ アプリケーション (やりたいこと) ハードウェア (やれること) アプリケーション (やりたいこと) アルゴリズム グラフィックス ライブラリ アルゴリズム アプリケーション (やりたいこと) グラフィックス ライブラリ アルゴリズム ハードウェア (やれること) ハードウェア (やれること) アルゴリズム
  • 10. 10 2.1.2 " ! ! ACM CORE ISO GKS GKS-3D PHIGS PHIGS+ " (API) ! ! (API) OpenGL DirectX ( ) ( 4) 2.1.3 GPU GPU CPU GPU OS
  • 11. 11 4 GPU 5 CPU側に実装 GPU側に実装 アプリケーション (やりたいこと) アルゴリズム アルゴリズム グラフィックスライブラリ プログラマブルシェーダ 固定機能ハードウェア グラフィックスライブラ リは GPU を対象とした ときに機能が整理された ハードウェア APIとして の役割に集中する ハードウェア (やれること) アルゴリズム アプリケーション (やりたいこと) アプリケーション (やりたいこと) アプリケーション (やりたいこと) アルゴリズム アルゴリズム ミドルウェア ハードウェア API プログラマブルシェーダ 固定機能ハードウェア ハードウェア (やれること) アルゴリズム
  • 12. 12 2.1.4 ( 5) CG ( ) API OpenInventor OpenSceneGraph SceniX CryENGINE Unreal Engine Unity OROCHI MascotCapsule Irrlicht chidori DAIKOKU OGRE BISHAMON YEBIS CRI-ADX2 PhysX Havok ODE Bullet 6 2.2 2.2.1 3DCG 3DCG 形状情報 材質情報 光源情報 視点情報 映像情報
  • 13. 13 ( 6) 2.2.2 " ( 7) 7 " ( 8) 8
  • 14. 14 GPU 2.2.3 CAD ( ) CAD Hz (Hertz) fps (frame per second) 6 8 fps 15 fps 60 Hz 60 fps 1 60 Hz 120 Hz ( ) 240 Hz ( ) フレームレート 1 fps 8 fps 15 fps 60 fps 動きの知覚 一枚一枚の画像が順に現れるように見えて対話的操作はほぼ不可能 ぎこちないが動画として知覚されて対話的操作が可能になる 動きはほぼ滑らかに感じられて対話的操作に違和感がない 一般的なフラットパネルディスプレイのリフレッシュレート
  • 15. 15 2.2.4 ( ) CPU CPU GPU GPU PC 3DCG GPU GPU GPU 2.3 2.3.1 9 ( ) (throughput) 9 パイプライン1段 パイプライン3段 (3倍速い)
  • 16. 16 10 2.4 2.4.1 11 2.4.2 CPU ( ) 各ステージが等間隔 一部のステージが長い (やることがない)
  • 17. 17 (Rendering Primitive) (Attribute) ( ) GPU ( ) ( ) ( ) ( ) ( ) ( ) CPU ( ) CPU 2.4.3 ( ) ( 12) ( 13)
  • 18. 18 CPU GPU (Graphics Processing Unit) T & L (Transform and Lighting) 12 13 " ( ) ( 14) Single-Pipe Multi-Pipe
  • 19. 19 14 " ( 15) 16 15 ローカル座標系 ローカル座標系 ローカル座標系 ワールド座標系
  • 20. 20 16 17 " ( 17) ( Pixel) ( ) ( ) GPU ローカル座標系 ローカル座標系 ワールド座標系 視点座標系 x z y x z y x z y x z y スクリーン 陰影付けなし 陰影付けあり
  • 21. 21 18 19 " (View Volume) 2 (Canonical View Volume) ( 18) (Orthogonal Projection) 標準ビューボリューム 視野錐台 (View Frustum) 直交投影 (Orthographic Projection) 透視投影 (Perspective Projection) 1 -1 1 -1 1 -1 ビューボリューム (View Volume) (Canonical View Volume) 直交投影 透視投影
  • 22. 22 (Perspective Projection) ( 19) (View Frustum, ) 20 21 " (Clipping) (Normalized Dvice Coordnate, NDC) 1 -1 1 -1 O 1 -1 1 -1 O クリッピング前 クリッピング後 x y x y クリッピング前 クリッピング後
  • 23. 23 " xy (Viewport) (Viewport Transformation) (Screen Mapping) 22 23 2.4.4 ( 23) 1 -1 1 -1 O クリッピング空間 x y w hx y ビューポート デバイス座標系正規化デバイス座標系の xy 平面
  • 24. 24 " (Triangle Setup) ( , Scan Conversion) 24 " ( ) " ( ) ジオメトリデータ フラグメントデータ
  • 25. 25 25 " (Frame Buffer Object, FBO) フォグなし フォグあり
  • 26. 26 ( ) 26 図形 描画 カラーバッファ(画像表示) デプスバッファ(隠面消去) ステンシルバッファ(型抜き) R G B A
  • 27. 27 3 3.1 GLFW OpenGL 1.5.1 GLFW (http://www.glfw.org) GLFW 3.1.1 Windows GLFW (http://www.glfw.org/download.html) “32-bit Windows binaries” 32bit ZIP glfw-3.X.Y.bin.WIN32.zip (X, Y ) ( C:¥ ) (Visual Studio 2013 ) VC++ " 32bit Windows include GLFW C:¥Program*Files¥Windows*Kits¥8.1¥Include¥um* lib-msvc120 glfw3.lib C:¥Program*Files¥Windows*Kits¥8.1¥Lib¥winv6.3¥um¥x86*
  • 28. 28 " 64bit Windows include GLFW C:¥Program*Files*(x86)¥Windows*Kits¥8.1¥Include¥um* lib-msvc120 glfw3.lib C:¥Program*Files*(x86)¥Windows*Kits¥8.1¥Lib¥winv6.3¥um¥x86* Visual Studio VC++ ZIP ( ) CMake (http://www.cmake.org) CMake (cmake-gui) “Where is the source code” ZIP “Where to build the binaries” “Configure” Visual Studio “Generate” Visual Studio 3.1.2 Mac OS X Mac OS X Xcode Command Line Tools Xcode AppStore Command Line Tools Xcode 5 “Xcode” “Open Developer Tool” “More Developer Tools” ( ) MacPorts (http://www.macports.org) GLFW 3 HomeBrew (http://brew.sh) Fink (http://www.finkproject.org) " GLFW (http://www.glfw.org/download.html) ZIP glfw-3.X.Y.zip (X, Y ) glfw-3.X.Y ( ) ‘%’ /usr/local %*cd*~/Desktop/glfwK3.X.Y* %*mkdir*build* %*cd*build* %*cmake*..* %*make* %*sudo*make*install* " GLFW GLFW build Makefile ( ) %*cd*~/Desktop/glfwK3.X.Y/build* %*sudo*make*uninstall*
  • 29. 29 3.1.3 Linux Linux (X11) NVIDIA GeForce 8 ATI RADEON HD Intel CPU https://01.org Fedora (http://fedoraproject.org) GLFW 3 Ubuntu (http://www.ubuntu.com) OpenSUSE (http://www.opensuse.org) " GLFW (http://www.glfw.org/download.html) ZIP glfw-3.X.Y.zip (X, Y ) ( ) ‘%’ /usr/local %*unzip*glfwK3.X.Y.zip* %*cd*glfwK3.X.Y* %*mkdir*build* %*cd*build* %*cmake*..* %*make* %*sudo*make*install* " GLFW GLFW build Makefile ( ) %*cd*glfwK3.X.Y/build* %*sudo*make*uninstall* 3.2 (Integrated Development Environment, IDE) 3.2.1 Windows " Windows Visual Studio 2013 Visual Studio 2013 27
  • 30. 30 27 Visual C++ Win32 OK ( 28) 28 Win32 29 29 ( 30) main()
  • 31. 31 30 " GLFW ( 31) 31 32 32
  • 32. 32 ( ) " VC++ ( ) GLFW ( 33) ( ) VC++ < …> 33 ( 34) … 34 ( ! ) GLFW ZIP include ( 35)
  • 33. 33 35 GLFW include OK ( 36) 36 < …> ( 37) 37 ( 38) …
  • 34. 34 38 GLFW ZIP lib-msvc120 ( 39) 39 GLFW lib-msvc120 OK ( 40) 40 " GLFW OpenGL
  • 35. 35 ( 41) < …> 41 glfw3.lib, opengl32.lib ( 42) OK 42 glfw3.lib opengl32.lib 43 43 “glfw3.lib; opengl32.lib;”
  • 36. 36 OK ( ) 2 #pragma*comment(lib,*"glfw3.lib")* #pragma*comment(lib,*"opengl32.lib")* GLFW Win32 OpenGL ( 1 ) #pragma*comment(linker,*"/subsystem:¥"windows¥"*/entry:¥"mainCRTStartup¥"")* (Dynamic Link Library, DLL) DLL glfw3.lib DLL DLL Visual C++ Visual C++ GLFW glfw3.lib glfw3dll.lib DLL (glfw3.dll) glfw3.dll glfw3.dll C:¥Windows¥System32 (32bit Windows) C:¥Windows¥SysWOW64 (64bit
  • 37. 37 Windows) 2 Path glfw3.dll " ( 44) 44 ( 45) Visual C++ C++ (.cpp) 45 C++ ( 46) 2 Windows 7: Windows 8: PC
  • 38. 38 46 3.2.2 Mac OS X " Mac OS X Xcode 5 Xcode ( 47) “Create a new Xcode project” “File” “New” “Project” 47 “OS X” “Application” “Command Line Tool” “Next” ( 48)
  • 39. 39 48 “Product Name” “Organization Name” “Company Identifier” “Type” C++ “Next” ( 49) 49 “Create” ( 50)
  • 40. 40 50 " 51 “Targets” “Build Settings” “search” “Header Search Paths” “+” GLFW (/usr/local/include) 51 ESC
  • 41. 41 “Library Search Paths” ( 52) GLFW (/usr/local/lib) 52 “linker” “Other Linker Flags” ( 53) “+” 1 Klglfw3*Kframework*Cocoa*Kframework*IOKit*Kframework*OpenGL*Kframework*CoreVideo* 53
  • 42. 42 “main.cpp” ( 54) main() “ .1” Unix Linux man “Delete” 54 " Makefile Xcode Makefile mkdir ‘%’ %*mkdir*sample* Makefile ( ) CXXFLAGS*=*KI/usr/local/include*–Wall* LDLIBS* =*KL/usr/local/lib*Klglfw3*Kframework*Cocoa*Kframework*IOKit*¥* * Kframework*OpenGL*Kframework*CoreVideo* OBJECTS* =*$(patsubst*%.cpp,%.o,$(wildcard**.cpp))* TARGET* =*sample* * .PHONY:*clean* * $(TARGET):*$(OBJECTS)* * $(LINK.cc)*$^*$(LOADLIBES)*$(LDLIBS)*Ko*$@* * clean:* * K$(RM)*$(TARGET)*$(OBJECTS)**~*.*~*core* make
  • 43. 43 3.2.3 Linux " Geany Linux Geany (http://www.geany.org) Geany main.cpp ‘%’ %*geany*main.cpp* Geany C++ main.cxx ( 55) “.cxx” Linux C++ 55 56
  • 44. 44 Geany ( 56) ( 57) -lm GLFW OpenGL *KlGL*Klglfw3*KlXi*KlXrandr*KlXxf86vm*KlX11*Klrt*Klpthread*Klm* OK 57 " Makefile Geany Makefile mkdir ‘%’ %*mkdir*sample* Makefile ( ) CXXFLAGS*=*KWall* LDLIBS* =*KlGL*Klglfw3*KlXi*KlXrandr*KlXxf86vm*KlX11*Klrt*Klpthread*–lm* OBJECTS* =*$(patsubst*%.cpp,%.o,$(wildcard**.cpp))* TARGET* =*sample* * .PHONY:*clean* * $(TARGET):*$(OBJECTS)* * $(LINK.cc)*$^*$(LOADLIBES)*$(LDLIBS)*Ko*$@* * clean:* * K$(RM)*$(TARGET)*$(OBJECTS)**~*.*~*core*
  • 45. 45 make 3.3 3.3.1 OpenGL GLFW GLFW (1) GLFW (glfwInit()) (2) (glfwCreateWindow()) (3) (glfwWindowShouldClose()) (4) (glfwSwapBuffers()) (5) (glfwTerminate()) C++ ( ) int*main()* {* }* ( ) main() 3.3.2 GLFW main() GLFW GLFW GLFW/glfw3.h #include main() glfwInit() OpenGL glfwInit() GL_FALSE GLFW #include*<iostream>* #include*<GLFW/glfw3.h>* * int*main()* {* **//*GLFW* * **if*(glfwInit()*==*GL_FALSE)* **{* ****//* * ****std::cerr*<<*"Can't*initialize*GLFW"*<<*std::endl;* ****return*1;* **}* }*
  • 46. 46 int glfwInit(void) GLFW GLFW GL_TRUE GL_FALSE 3.3.3 GLFW glfwCreateWindow() OpenGL glfwCreateWindow() NULL glfwInit() GLFW return glfwTerminate() GLFW #include*<iostream>* #include*<GLFW/glfw3.h>* * int*main()* {* **//*GLFW* * **if*(glfwInit()*==*GL_FALSE)* **{* ****//* * ****std::cerr*<<*"Can't*initialize*GLFW"*<<*std::endl;* ****return*1;* **}* * **//* * **GLFWwindow**const*window(glfwCreateWindow(640,*480,*"Hello!",*NULL,*NULL));* **if*(window*==*NULL)* **{* ****//* * ****std::cerr*<<*"Can't*create*GLFW*window."*<<*std::endl;* ****glfwTerminate();* ****return*1;* **}* }* GLFWwindow *glfwCreateWindow(int width, int height, const char *title, GLFWmonitor *monitor, GLFWwindow *share) GLFW NULL width 0 height 0 title UTF-8
  • 47. 47 monitor ( ) ( ) NULL share share NULL void glfwTerminate(void) GLFW glfwInit() GLFW GLFW glfwInit() GLFW glfwInit() 3.3.4 glfwMakeContextCurrent() #include*<iostream>* #include*<GLFW/glfw3.h>* * int*main()* {* **//*GLFW* * **if*(glfwInit()*==*GL_FALSE)* **{* ****//* * ****std::cerr*<<*"Can't*initialize*GLFW"*<<*std::endl;* ****return*1;* **}* * **//* * **GLFWwindow**const*window(glfwCreateWindow(640,*480,*"Hello!",*NULL,*NULL));* **if*(window*==*NULL)* **{* ****//* * ****std::cerr*<<*"Can't*create*GLFW*window."*<<*std::endl;* ****glfwTerminate();* ****return*1;* **}* * **//* *OpenGL* * **glfwMakeContextCurrent(window);* }* void glfwMakeContextCurrent(GLFWwindow *const window) window ( )
  • 48. 48 window OpenGL 3.3.5 OpenGL glfwMakeContextCurrent() OpenGL OpenGL glClearColor() ( ) gl OpenGL API (GLFW glfw ) #include*<iostream>* #include*<GLFW/glfw3.h>* * int*main()* {* **//*GLFW* * **if*(glfwInit()*==*GL_FALSE)* **{* ****//* * ****std::cerr*<<*"Can't*initialize*GLFW"*<<*std::endl;* ****return*1;* **}* * **//* * **GLFWwindow**const*window(glfwCreateWindow(640,*480,*"Hello!",*NULL,*NULL));* **if*(window*==*NULL)* **{* ****//* * ****std::cerr*<<*"Can't*create*GLFW*window."*<<*std::endl;* ****glfwTerminate();* ****return*1;* **}* * **//* *OpenGL* * **glfwMakeContextCurrent(window);* * **//* * **glClearColor(1.0f,*1.0f,*1.0f,*0.0f);* }* void glClearColor(GLclampf R, GLclampf G, GLclampf B, GLclampf A) glClear(GL_COLOR_BUFFER_BIT) R G B GLclampf (float ) 0 1 ( 58) 1 0, 0, 0 1, 1, 1 A OpenGL (0 1 ) 0
  • 49. 49 58 R, G, B 3.3.6 main() while glfwWindowShouldClose() const glClear() OpenGL glfwSwapBuffers() glfwWindowShouldClose() const glfwWaitEvents() glfwPollEvents() ( 2) #include*<iostream>* #include*<GLFW/glfw3.h>* * int*main()* {* **//*GLFW* * **if*(glfwInit()*==*GL_FALSE)* **{* ****//* * ****std::cerr*<<*"Can't*initialize*GLFW"*<<*std::endl;* ****return*1;* **}* * **//* * **GLFWwindow**const*window(glfwCreateWindow(640,*480,*"Hello!",*NULL,*NULL));* **if*(window*==*NULL)* **{* ****//* * ****std::cerr*<<*"Can't*create*GLFW*window."*<<*std::endl;* ****glfwTerminate();*
  • 50. 50 ****return*1;* **}* * **//* *OpenGL* * **glfwMakeContextCurrent(window);* * **//* * **glClearColor(1.0f,*1.0f,*1.0f,*0.0f);* * **//* * **while*(glfwWindowShouldClose(window)*==*GL_FALSE)* **{* ****//* * ****glClear(GL_COLOR_BUFFER_BIT);* * ****//* ****//* * ****//* * ****//* * ****glfwSwapBuffers(window);* * ****//* * ****glfwWaitEvents();* **}* }* int glfwWindowShouldClose(GLFWwindow *const window) window 0 void glClear(GLbitfield mask) mask ( 26) mask GL_COLOR_BUFFER_BIT glClearColor() void glfwSwapBuffers(GLFWwindow *const window) window void glfwWaitEvents(void) void glfwPollEvents(void)
  • 51. 51 2 " OpenGL OpenGL ( 59) 59 " glfwWaitEvents() glfwPollEvents() ( ) ( ) イベントが発生するまで待つ (プログラムの実行 を停止する)。イベントが発生すれば、最初のイベ ントを取り出してプログラムの実行を再開する。 glewWaitEvents() glewPollEvents() イベントが発生していれば、それを取り出す。イ ベントの有無にかかわらず、次に進む (プログラ ムの実行を停止しない)。 バッファの入れ替え glfwSwapBuffers() 表示 描画 表示 描画
  • 52. 52 3.3.7 glfwInit() glfwTerminate() main() return glfwTerminate() #include*<iostream>* #include*<GLFW/glfw3.h>* * int*main()* {* **//*GLFW* * **if*(glfwInit()*==*GL_FALSE)* **{* ****//* * ****std::cerr*<<*"Can't*initialize*GLFW"*<<*std::endl;* ****return*1;* **}* * **//* * **GLFWwindow**const*window(glfwCreateWindow(640,*480,*"Hello!",*NULL,*NULL));* **if*(window*==*NULL)* **{* ****//* * ****std::cerr*<<*"Can't*create*GLFW*window."*<<*std::endl;* ****glfwTerminate();* ****return*1;* **}* * **//* *OpenGL* * **glfwMakeContextCurrent(window);* * **//* * **glClearColor(1.0f,*1.0f,*1.0f,*0.0f);* * **//* * **while*(glfwWindowShouldClose(window)*==*GL_FALSE)* **{* ****//* * ****glClear(GL_COLOR_BUFFER_BIT);* * ****//* ****//* * ****//* * ****//* * ****glfwSwapBuffers(window);* * ****//* * ****glfwWaitEvents();* **}* * **glfwTerminate();* }*
  • 53. 53 " atexit() glTerminate() glTerminate() main() return glfwCreateWindow() glTerminate() glTerminate() atexit() atexit() cstdlib #include glfwTerminate() cleanup() glfwInit() atexit() cleanup() main() glfwTerminate() #include*<cstdlib>* #include*<iostream>* #include*<GLFW/glfw3.h>* * //* * static*void*cleanup()* {* **//*GLFW* * **glfwTerminate();* }* * int*main()* {* **//*GLFW* * **if*(glfwInit()*==*GL_FALSE)* **{* ****//* * ****std::cerr*<<*"Can't*initialize*GLFW"*<<*std::endl;* ****return*1;* **}* * **//* * **atexit(cleanup);* * **//* * **GLFWwindow**const*window(glfwCreateWindow(640,*480,*"Hello!",*NULL,*NULL));* **if*(window*==*NULL)* **{* ****//* * ****std::cerr*<<*"Can't*create*GLFW*window."*<<*std::endl;* ****return*1;* **}* * **//* *OpenGL* * **glfwMakeContextCurrent(window);* * **//* * **glClearColor(1.0f,*1.0f,*1.0f,*0.0f);* *
  • 54. 54 **//* * **while*(glfwWindowShouldClose(window)*==*GL_FALSE)* **{* ****//* * ****glClear(GL_COLOR_BUFFER_BIT);* * ****//* ****//* * ****//* * ****//* * ****glfwSwapBuffers(window);* * ****//* * ****glfwWaitEvents();* **}* }* int atexit(void (*function)(void)) atexit() function atexit() ( 32 ) 0 0 3.3.8 OpenGL OpenGL 3.2 OpenGL glfwCreateWindow() glfwWindowHint() * * int*main()* {* **//*GLFW* * **if*(glfwInit()*==*GL_FALSE)* **{* ****//* * ****std::cerr*<<*"Can't*initialize*GLFW"*<<*std::endl;* ****return*1;* **}* * **//* * **atexit(cleanup);* * **//*OpenGL*Version*3.2*Core*Profile* * **glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,*3);* **glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR,*2);* **glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT,*GL_TRUE);* **glfwWindowHint(GLFW_OPENGL_PROFILE,*GLFW_OPENGL_CORE_PROFILE);* * **//* * **GLFWwindow**const*window(glfwCreateWindow(640,*480,*"Hello!",*NULL,*NULL));* **if*(window*==*NULL)* **{*
  • 55. 55 ****//* * ****std::cerr*<<*"Can't*create*GLFW*window."*<<*std::endl;* ****return*1;* **}* * **//* *OpenGL* * **glfwMakeContextCurrent(window);* * **//* * **glClearColor(1.0f,*1.0f,*1.0f,*0.0f);* * * void glfwWindowHint(int target, int hint) glfwCreateWindow() glfwDefaultWindowHints() target ( ) GLFW_RED_BITS, GLFW_GREEN_BITS, GLFW_BLUE_BITS, GLFW_ALPHA_BITS hint 8 GLFW_DEPTH_BITS hint 24 GLFW_STENCIL_BITS hint 8 GLFW_SAMPLES hint 0 0 GLFW_STEREO hint GL_TRUE GL_FALSE GL_TRUE GLFW_CLIENT_API hint GLFW_OPENGL_ES_API OpenGL ES API GLFW_OPENGL_API GLFW_CONTEXT_VERSION_MAJOR OpenGL hint 3.2 3 1 GLFW_CONTEXT_VERSION_MINOR OpenGL hint 3.2 2 1 GLFW_OPENGL_FORWARD_COMPAT OpenGL Forward Compatible Profile ( ) hint GL_TRUE GL_FALSE
  • 56. 56 GLFW_OPENGL_PROFILE OpenGL Compatible Profile hint GLFW_OPENGL_COMPAT_PROFILE Core Profile hint GLFW_OPENGL_CORE_PROFILE 0 glfwWindowHint() glfwCreateWindow() 3.3.9 glfwCreateWindow() glfwSwapInterval() * * int*main()* {* **//*GLFW* * **if*(glfwInit()*==*GL_FALSE)* **{* ****//* * ****std::cerr*<<*"Can't*initialize*GLFW"*<<*std::endl;* ****return*1;* **}* * **//* * **atexit(cleanup);* * **//*OpenGL*Version*3.2*Core*Profile* * **glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,*3);* **glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR,*2);* **glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT,*GL_TRUE);* **glfwWindowHint(GLFW_OPENGL_PROFILE,*GLFW_OPENGL_CORE_PROFILE);* * **//* * **GLFWwindow**const*window(glfwCreateWindow(640,*480,*"Hello!",*NULL,*NULL));* **if*(window*==*NULL)* **{* ****//* * ****std::cerr*<<*"Can't*create*GLFW*window."*<<*std::endl;* ****return*1;* **}* * **//* *OpenGL* * **glfwMakeContextCurrent(window);* * **//* * **glfwSwapInterval(1);* * **//* * **glClearColor(1.0f,*1.0f,*1.0f,*0.0f);*
  • 57. 57 * * void glfwSwapInterval(int interval) interval interval (V-Sync ) 1 0 fps (frame per second) 3.3.10 3.3.8 OpenGL OpenGL 3.2 Core Profile OpenGL API (Windows OpenGL 1.1 API ) API GLEW (The OpenGL Extension Wrangler Library, http://glew.sourceforge.net) Windows / Mac OS X / Linux gg.cpp gg.h ( ) glext.h (http://www.opengl.org/registry/api/glext.h) ( ) " ! gg.cpp ! gg.h ! glext.h #include <GL/glfw.h> #include "gg.h" using namespace gg; glfwInit() glfwSwapInterval(1) ggInit() ggInit() glfwOpenWindow() (0, 0, 0, 0, 0, 0, 0, 0, GLFW_WINDOW) " #include*<cstdlib>* #include*<iostream>*
  • 58. 58 #include*<GLFW/glfw3.h>* * //* * #include*"gg.h"* using*namespace*gg;* * //* * static*void*cleanup()* {* **//*GLFW* * **glfwTerminate();* }* * int*main()* {* **//*GLFW* * **if*(glfwInit()*==*GL_FALSE)* **{* ****//* * ****std::cerr*<<*"Can't*initialize*GLFW"*<<*std::endl;* ****return*1;* **}* * **//* * **atexit(cleanup);* * **//* * **GLFWwindow**const*window(glfwCreateWindow(640,*480,*"Hello!",*NULL,*NULL));* **if*(window*==*NULL)* **{* ****//* * ****std::cerr*<<*"Can't*create*GLFW*window."*<<*std::endl;* ****return*1;* **}* * **//* *OpenGL* * **glfwMakeContextCurrent(window);* * **//* * **glfwSwapInterval(1);* * **//* * **ggInit();* * **//* * **glClearColor(1.0f,*1.0f,*1.0f,*0.0f);* * **//* * **while*(glfwWindowShouldClose(window)*==*GL_FALSE)* **{* ****//* * ****glClear(GL_COLOR_BUFFER_BIT);* * ****//* ****//* * ****//* * ****//* *
  • 59. 59 ****glfwSwapBuffers(window);* * ****//* * ****glfwWaitEvents();* **}* }* " OpenGL 3.2 Core Profile gluLookAt() GLU (OpenGL Utility) GLU GLFW_NO_GLU #define Windows OpenGL 1.2 GLEW glfwCreateWindow() GLFW ggInit() glewExperimental = GL_TRUE; glewInit() #incoude*<GL/glew.h>* #incoude*<GLFW/glfw3.h>* *** ...* *** **//* * **glewExperimental*=*GL_TRUE;* **if*(glewInit()*!=*GLEW_OK)* **{* ****//* * ****return*1;* **}* Mac OS X Mac OS X glfw3.h #include GLFW_INCLUDE_GLCOREARB #define gl3ext.h #include #define*GLFW_INCLUDE_GLCOREARB* #include*<GLFW/glfw3.h>* #include*<OpenGL/gl3ext.h>* Linux Linux X11 C++ GL_GLEXT_PROTOTYPES #define #define*GL_GLEXT_PROTOTYPES* #include*<GLFW/glfw3.h>* #include*<GL/glext.h>* gg.h / gg.cpp
  • 60. 60 3.4 make 3.4.1 Windows Visual Studio 2013 ( 60) “ ” 60 Visual Studio 2013 F5 Debug LINK : warning LNK4098: defaultlib 'MSVCRT' /NODEFAULTLIB:library GLFW 3.4.2 Mac OS X Xcode ( 61) Command R 61 Xcode
  • 61. 61 c++ -I/usr/local/include -L/usr/local/lib -lglfw3 -framework Cocoa -framework IOKit -framework OpenGL -framework CoreVideo ‘%’ %*c++*main.cpp*KI/usr/local/include*KL/usr/local/lib*Klglfw3*¥* Kframework*Cocoa*Kframework*IOKit*Kframework*OpenGL*Kframework*CoreVideo* Makefile make Makefile make %*make* 3.4.3 Linux Geany ( 62) F9 F5 62 Geany c++ -lGL -lglfw3 -lXi -lXrandr -lXxf86vm -lX11 -lrt -lpthread -lm ‘%’ %*c++*main.cpp*KlGL*Klglfw3*KlXi*KlXrandr*KlXxf86vm*KlX11*Klrt*Klpthread*Klm* Makefile make Makefile make %*make*