ProgrammingのTipなど

基本的なglfwのプログラム


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 -lglu32
Windows環境の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に任せるだけで設定してくれます
glfwMakeContextCurrent(window);
glfwに頼らず自前でコンテキストを作成すると少しメンドクサイのですが
glfwならこの行を1行書くだけで済みます。
コールバック関数の設定
glfw側のループ内での様々な処理は
それぞれコールバック関数で行います
glfwSetFramebufferSizeCallback(window, framebufferSizeCallback);
glfwSetKeyCallback(window, key_callback);
glfwSetFramebufferSizeCallbackはウィンドウのリシェイプ(サイズ変更)
glfwSetKeyCallbackはキー入力の処理
を行います
OpenGLのユーザー側の初期化処理
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);
}
glfwのループ処理
OpenGLは3Dのアニメーションなので
whileループ内で描画関数を呼びます
  while (!glfwWindowShouldClose(window)) 
  {
    描画処理
    glfwSwapBuffers(window);
    glfwPollEvents();
  }

  while (!glfwWindowShouldClose(window)) 
  {
    int width, height;
    glfwGetFramebufferSize(window, &width, &height);
    reShape(width, height);

    display();
    glfwSwapBuffers(window);
    glfwPollEvents();
  }
Linuxでのmakefile例
ライブラリ名が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)
MSYS2でのmakefile例
glewがインストールされてる前提

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) 

Linux用CMakeLists.txt
project(glfw1)
cmake_minimum_required(VERSION 3.22)
add_executable(a main.cpp)
include_directories("${PROJECT_SOURCE_DIR}") 
target_link_libraries(a glfw GL GLU)

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu

メニュー2

開くメニュー

閉じるメニュー

  • アイテム
  • アイテム
  • アイテム
【メニュー編集】

管理人/副管理人のみ編集できます