10
03

https://github.com/jiwonchoidd/Jiwon_opengl

1. 서론

다이렉트X는 윈도우 플랫폼에 종속적이고 COM기반으로 제작되었다.

기본적으로 윈도우에는 해당 SDK가 내장되어 쉽게 환경 구성을 할 수 있다.

OpenGL 자체는 실제 구현된 라이브러리가 아니라 API 스펙 그 자체여서

그래픽카드와 상호작용하는 기능만 있고, 그게 어떤 플랫폼의 그래픽 카드

인지는 모르는 API이다. 그래서 남들이 만든 라이브러리를 사용해서 

그래픽카드와 연결한다.

GLFW, SDL, Freeglut 등 있지만 나는 많이 사용하는 GLFW를 사용함.

 

2. 설치한 라이브러리

GLFW 3.3.8 version installed  // https://www.glfw.org/

ㄴ 앞서 말했다싶이 디바이스 연결용

GLEW 2.1.0 version installed // https://glew.sourceforge.net/

ㄴ윈도우가 구버전 opengl 지원해서 높은 버전을 위해 사용함

GLM

ㄴ이건 수학 라이브러리, 필요하면 받자

 

3. 환경 설정 및 화면 띄우기

콘솔용 메인함수 int main을 쓰든 윈도우용 winmain을 쓰든

환경 설정을 완료하기 위해 일단 창을 띄워보자.

 

프로젝트 include lib 폴더에 각각 파일을 넣어주었다.

비주얼 스튜디오를 켜고 넣은 include와 lib 연결을 해준다.

 

추가 포함 디렉터리에 헤더 폴더 연결
라이브러리 폴더 연결

 

속성에 라이브러리 이름을 기입해서 연결할 수 있지만, 

나는 라이브러리와 인크루드를 관리하는 헤더 하나를 만들었다.

 

//DD_Std.h

#pragma once
#pragma comment	(lib, "glew32.lib")
#pragma comment	(lib, "glfw3.lib")
#pragma comment	(lib, "opengl32.lib")
#include "glew.h"
#include "glfw3.h"

 

위 헤더를 메인 함수에 연결시켜서 잘 연결되었는지 확인해보자.

아래는 메인함수이다. 위 std 헤더를 연결해주었다. 

 

#include "DD_MainCore.h"
#include "DD_Std.h"
int main()
{
    GLFWwindow* window; 

    if (false == glfwInit())
        return -1;

    window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
    if (nullptr == window)
    {
        glfwTerminate(); 
        return -1;
    }


    glfwMakeContextCurrent(window); 
    glewInit(); 
    glClearColor(0.5, 0.75, 1, 1);


    while (!glfwWindowShouldClose(window))
    {
        glClear(GL_COLOR_BUFFER_BIT); 
        glfwSwapBuffers(window); 
        glfwPollEvents(); 
    }

    glfwTerminate();
    return 0;
}

 

논외지만 다렉보다 굉장히 간단해서 놀랐다. 

빌드를 해서 본다면 아래와 같은 화면이 나올 것이다.

 

 

동적 라이브러리 dll 파일이 없다고 나온다면 아까 glew에서 받은 dll 파일을

실행파일 위치에 같이 넣어주면 해결이 된다. 

아래 경로에 있다.

이 위치에 있다.

 

 

이렇게 해서 opengl 환경설정을 마치고 창까지 띄워보았다.

추가적으로 엔진 라이브러리 프로젝트와  이를 사용하려는 프로젝트를 구분하였다.

 

엔진 및 사용 프로젝트 구분

기존 프로젝트를 출력을 Lib로 하고 새로운 프로젝트에서

그 라이브러리를 사용하면 된다. 빌드후처리로 바로 작업 폴더에

옮기게 자동화하는 걸 추천한다.

#include "DD_MainCore.h"

void Framebuffer_size_callback(GLFWwindow* window, int width, int height);
void processInput(GLFWwindow* window);

void DD_MainCore::Start()
{
    // glfw: 초기화 및 설정
    // ------------------------------
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

#ifdef __APPLE__
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
#endif

    // glfw 윈도우 생성
    // --------------------
    pWindow = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);
    if (pWindow == NULL)
    {
        glfwTerminate();
        return;
    }
    glfwMakeContextCurrent(pWindow);
    glfwSetFramebufferSizeCallback(pWindow, Framebuffer_size_callback);

    // glew 초기화
    glewInit();
}
void DD_MainCore::Frame()
{
    // render loop
    // -----------
    while (!glfwWindowShouldClose(pWindow))
    {
        // input
        // -----
        processInput(pWindow);

        // glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.)
        // -------------------------------------------------------------------------------
        glfwSwapBuffers(pWindow);
        glfwPollEvents();
    }
}

void DD_MainCore::Release()
{
    glfwTerminate();
    glfwDestroyWindow(pWindow);
    pWindow = nullptr;
}
void Framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
    glViewport(0, 0, width, height);
}
void processInput(GLFWwindow* window)
{
    if (glfwGetKey(window, GLFW_KEY_E) == GLFW_PRESS)
        glfwSetWindowShouldClose(window, true);
}

 

Sample에서는 이런식으로 우리가 만든 라이브러리를 사용하면 된다.

#pragma once
#pragma comment	(lib, "ddEngine.lib")
#include "DD_MainCore.h"
int main()
{
	DD_MainCore* gEngine = new DD_MainCore();

	gEngine->Start();

	gEngine->Frame();

	gEngine->Release();

	delete gEngine;
	gEngine = nullptr;

	return -1;
}

 

이런식으로 나누면 나중에 작업할때 편할 것이다.

COMMENT