2016-09-19 2 views
1

저는 현재 커스텀 OpenGL 함수 로더를 만들려고하고 있습니다. 그래서 나만의 커스텀 게임 엔진을 디자인 할 수 있습니다.로더 헤더를 포함 할 때 OpenGL 함수를 사용할 수없는 이유는 무엇입니까?

#ifndef SWOGLL_H_ 
#define SWOGLL_H_ 
#pragma once 

#include <Windows.h> 
#include <gl/GL.h> 
#include <gl/GLU.h> 
#include <gl/glext.h> 
#include <gl/wglext.h> 

static PFNGLACTIVESHADERPROGRAMPROC glActiveShaderProgram; 
static PFNGLACTIVETEXTUREPROC glActiveTexture; 
// ... 

static void* GetGLFunctionPointer(const char* functionName) 
{ 
    void* functionPointer = (void*)wglGetProcAddress(functionName); 
    if(
     functionPointer == (void*)0x0 || 
     functionPointer == (void*)0x1 || 
     functionPointer == (void*)0x2 || 
     functionPointer == (void*)0x3 || 
     functionPointer == (void*)-0x1 
    ) 
    { 
     HMODULE module = LoadLibraryA("opengl32.dll"); 
     functionPointer = (void*)GetProcAddress(module, functionName); 
    } 
    return functionPointer; 
} 


static void GenerateGLFunctionPointers() 
{ 
    glActiveShaderProgram = (PFNGLACTIVESHADERPROGRAMPROC)GetGLFunctionPointer("glActiveShaderProgram"); 
    glActiveTexture = (PFNGLACTIVETEXTUREPROC)GetGLFunctionPointer("glActiveTexture"); 
    // ... 
} 

내가 내 main.cpp 파일 #include "SWOGLL.h"이는 OpenGL 기능을 내가는 OpenGL 컨텍스트를 만든 후 GenerateGLFunctionPointers()라고 한 가정, 잘 작동하는 경우 다음과 같이 로더 모든 코드를 포함하는 헤더 포맷됩니다.

그러나 OpenGL 컨텍스트가 이미 만들어진 경우에도 OpenGL 함수가 전혀 작동하지 않습니다.

여기에 문제가 있습니까?

+1

그런데'GetProcAddress()'대신'wglGetProcAddress()'를 사용해야합니다. GetProcAddress() 함수는 DLL에서 함수를로드하기위한 함수이며, OpenGL은 좀 더 까다 롭습니다. 올바른 동작을 얻으려면'wglGetProcAddress()'를 사용하십시오. –

+0

@DietrichEpp'wPGAddress'가'wglGetProcAddress'가 실패 할 경우를 대비해'GetProcAddress'를 추가했습니다.하지만 OpenGL 함수와 함께 작동하지 않으면 아마 제거 할 것입니다. –

+2

"* 커스텀 OpenGL 함수 로더를 만들어 내 자신 만의 커스텀 게임 엔진을 만들 수 있습니다. *"게임 엔진 용 커스텀 OpenGL 로더를 만들 필요가 없습니다. [선택할 수있는 곳이 많습니다.] (https://www.opengl.org/wiki/OpenGL_Loading_Library); 그들 중 하나가 당신의 필요를 돌볼 것입니다. –

답변

4

헤더 파일에 static 함수 및 변수를 선언하고 있습니다. 이렇게 이상한 일을하는 아주 좋은 이유가 없다면, 은 그렇게하지 마십시오.

static PFNGLACTIVESHADERPROGRAMPROC glActiveShaderProgram; 

static void* GetGLFunctionPointer(const char* functionName) 

glActiveShaderProgram, GetGLFunctionPointer()다른 복사본을 만들 것이며, 모든 다른 헤더를 포함 모든 C++ 파일에 static을 선언했다.

static를 제거하고 다음 중 하나를 수행합니다
  1. 헤더에 선언을 유지하지만, C++ 파일에 정의를 이동합니다.

  2. 선언문과 정의를 헤더에 그대로두고, inline으로 표시하십시오. 이것은 전역 변수에서 작동하지 않습니다.

static 키워드는,이 경우에는, 그렇게 static를 선언 된 함수와 변수는 당신이 그들을 정의 모든 C++ 파일들을 별도의 사본을 얻을 것을 의미한다 "내부 연결"가 있습니다. 이는 전혀 관련이없는 멤버 함수 static을 선언하는 것과는 다릅니다. 키워드 static이 다른 장소에서 다른 것을 의미한다는 것은 다소 불행한 일입니다. C'est la vie.

+0

'static '을 제거하고이 옵션 중 하나를 선택하면 수천 개의'LNK2005' 링커 오류가 발생합니다. –

+0

새로운 코드를 게시하면 이번에 무엇이 잘못되었는지 알 수 있습니다. 여러 파일이있는 C++ 프로그램을 처음 작성합니까? –

+0

처음에는 아니지만 경험이 거의 없습니다. 새로운 질문을 게시해야합니까? –