2016-09-19 3 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ファイル内のI #include "SWOGLL.h"場合は、OpenGLの機能は、OpenGLコンテキストを作成した後、私はGenerateGLFunctionPointers()呼ばれてきたと仮定すると、正常に動作します。

ただし、別のファイルと#include "SWOGLL.h"を作成した場合、OpenGLコンテキストが既に作成されていても、OpenGL関数はまったく動作しません。

ここで問題は何ですか?

+1

ところで、あなたは 'GetProcAddress()'の代わりに 'wglGetProcAddress()'を使うべきです。 'GetProcAddress()'関数は、DLLから関数をロードするための関数であり、OpenGLは少し難解です。正しい振る舞いを得るには 'wglGetProcAddress()'を使います。 –

+0

@DietrichEpp 'wglGetProcAddress'が失敗した場合のフェイルセーフとして' GetProcAddress'を追加しましたが、OpenGL関数で動作しない場合は、おそらく削除します。 –

+2

"カスタムのOpenGL関数ローダを作成して独自のカスタムゲームエンジンを設計することができます*"あなたのゲームエンジンにカスタムOpenGLローダーを作成する必要はありません。 [たくさん選ぶ](https://www.opengl.org/wiki/OpenGL_Loading_Library)。そのうちの1人があなたのニーズに対応します。 –

答えて

4

static関数と変数をヘッダファイルに宣言しています。あまりにも奇妙なことを行うには、例外的に正当な理由がなければ、はしないでください。

static PFNGLACTIVESHADERPROGRAMPROC glActiveShaderProgram; 

static void* GetGLFunctionPointer(const char* functionName) 

これはglActiveShaderProgramGetGLFunctionPointer()異なるコピーを作成し、他のすべてのヘッダを含むすべてのC++ファイルでstaticを宣言しました。

staticを削除し、次のいずれかの操作を行います。
  1. がヘッダに宣言をしてくださいますが、C++ファイルに定義を移動します。

  2. ヘッダーに宣言と定義を入れておきますが、inlineとします。これはグローバル変数では機能しません。

staticキーワードが、この場合には、それはそうstatic宣言された関数と変数は、あなたがそれらを定義するすべてのC++ファイルのためにそれらの別々のコピーを取得することを意味し、「内部リンケージ」を持っています。これは、メンバー関数staticの宣言とはまったく関係がありません。キーワードstaticは、別の場所で異なることを意味することは多少残念です。 C'est la vie。

+0

'static'を削除してこれらのオプションのいずれかを選択すると、何千もの' LNK2005'リンカエラーが発生します。 –

+0

新しいコードを投稿して、今回は何が間違っているのか調べることができます。複数のファイルを持つC++プログラムを初めて書くのですか? –

+0

初めてのことではありませんが、経験はほとんどありません。新しい質問を投稿する必要がありますか? –

関連する問題