g++でのコンパイル方法は
$g++ main.cpp -o a -lGL -lGLU -lglfwです
Linuxではglfwで
MSYS2ではglfw3
とライブラリの名称が違うので注意
WindowsのMSYS2のmingw64でのコンパイル
$x86_64-w64-mingw32-g++ main.cpp -o a -L /mingw64/lib -lglfw3 -lopengl32 -lglu32Windows環境のMSYS2版のglfw3だとコンソールがそのまま出続けてしまうので
FreeConsole();
をmain関数内に書くことで消すことができます
FreeConsole();には
Windows.h
をインクルードする必要があります
glfwはOpenGLのバージョンを指定できます
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 1); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);
main.cpp
#include <GL/gl.h> #include <GL/glu.h> #include <GLFW/glfw3.h> #include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; static void error_callback(int error, const char *description) { fputs(description, stderr); } static void key_callback(GLFWwindow *window, int key, int scancode, int action, int mods) { if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) glfwSetWindowShouldClose(window, GL_TRUE); } void reShape(int width, int height) { if (width == 0) width = 1; glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f, (GLfloat)width / (GLfloat)height, 0.1f, 100.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(0, 0, -5); glColor3f(0, 0, 1); glBegin(GL_TRIANGLES); glVertex3f(-1, 0, 0); glVertex3f(0, 1, 0); glVertex3f(1, 0, 0); glEnd(); } void framebufferSizeCallback(GLFWwindow *window, int width, int height) { reShape(width, height); } void glInit(void) { glClearColor(0.9, 0.9, 0.9, 1.0); glShadeModel(GL_SMOOTH); glClearDepth(1.0f); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); } int main(void) { GLFWwindow *window; glfwSetErrorCallback(error_callback); if (!glfwInit()) exit(EXIT_FAILURE); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 1); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1); window = glfwCreateWindow(640, 480, "window", NULL, NULL); if (!window) { glfwTerminate(); exit(EXIT_FAILURE); } glfwMakeContextCurrent(window); glfwSetFramebufferSizeCallback(window, framebufferSizeCallback); glfwSetKeyCallback(window, key_callback); glInit(); while (!glfwWindowShouldClose(window)) { int width, height; glfwGetFramebufferSize(window, &width, &height); reShape(width, height); display(); glfwSwapBuffers(window); glfwPollEvents(); } glfwDestroyWindow(window); glfwTerminate(); exit(EXIT_SUCCESS); }
glfwCreateWindow(横幅、縦幅,タイトル,モニター,シェア);で作成する
モニターとシェアは通常NULLでOK
ウィンドウのポインタを返します
GLFWwindow *window; window = glfwCreateWindow(640, 480, "window", NULL, NULL);
コンテキストとはOpenGL側の設定のようなものです
glfwでは特殊な設定でない限りglfwに任せるだけで設定してくれます
glfwならこの行を1行書くだけで済みます。
glfwでは特殊な設定でない限りglfwに任せるだけで設定してくれます
glfwMakeContextCurrent(window);glfwに頼らず自前でコンテキストを作成すると少しメンドクサイのですが
glfwならこの行を1行書くだけで済みます。
glfw側のループ内での様々な処理は
それぞれコールバック関数で行います
glfwSetKeyCallbackはキー入力の処理
を行います
それぞれコールバック関数で行います
glfwSetFramebufferSizeCallback(window, framebufferSizeCallback); glfwSetKeyCallback(window, key_callback);glfwSetFramebufferSizeCallbackはウィンドウのリシェイプ(サイズ変更)
glfwSetKeyCallbackはキー入力の処理
を行います
void glInit(void) { glClearColor(0.9, 0.9, 0.9, 1.0); glShadeModel(GL_SMOOTH); glClearDepth(1.0f); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); }
OpenGLは3Dのアニメーションなので
whileループ内で描画関数を呼びます
whileループ内で描画関数を呼びます
while (!glfwWindowShouldClose(window)) { 描画処理 glfwSwapBuffers(window); glfwPollEvents(); }例
while (!glfwWindowShouldClose(window)) { int width, height; glfwGetFramebufferSize(window, &width, &height); reShape(width, height); display(); glfwSwapBuffers(window); glfwPollEvents(); }
ライブラリ名がglfwであることに注意
SOURCE = main EXTENSIONTYPE = cpp INCLUDE = -I/usr/include/ LIBDIR = -L/usr/lib/x86_64-linux-gnu CC = g++ CFLAGS = -Wall LIBRARIES = -lglfw -lGL -lGLU EXENAME = $(SOURCE) OBJ = $(SOURCE).o all: $(OBJ) $(CC) $(CFLAGS) $(INCLUDE) -o $(EXENAME) $(LIBDIR) $(OBJ) $(LIBRARIES) $(SOURCE).o: $(SOURCE).$(EXTENSIONTYPE) $(CC) $(CFLAGS) $(INCLUDE) -c $^ $(LIBDIR) $(LIBRARIES) clean: rm $(OBJ) $(EXENAME)
glewがインストールされてる前提
makefile
makefile
SOURCE = main EXTENSIONTYPE = cpp INCLUDE = LIBDIR = -L /mingw64/lib CC = x86_64-w64-mingw32-g++ CFLAGS = LIBRARIES = -Bstsic -lgcc -static-libstdc++ -lwinpthread -Bdynamic -lglew32 -lglfw3 -lopengl32 -lglu32 EXENAME = a OBJ = $(SOURCE).o all: $(OBJ) $(CC) $(CFLAGS) $(INCLUDE) -o $(EXENAME) $(LIBDIR) $(OBJ) $(LIBRARIES) $(SOURCE).o: $(SOURCE).$(EXTENSIONTYPE) $(CC) $(CFLAGS) $(INCLUDE) -c $^ $(LIBDIR) $(LIBRARIES) clean: rm $(OBJ) $(EXENAME)
コメントをかく