私は現在、独自のカスタムゲームエンジンの設計を開始できるように、カスタム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関数はまったく動作しません。
ここで問題は何ですか?
ところで、あなたは 'GetProcAddress()'の代わりに 'wglGetProcAddress()'を使うべきです。 'GetProcAddress()'関数は、DLLから関数をロードするための関数であり、OpenGLは少し難解です。正しい振る舞いを得るには 'wglGetProcAddress()'を使います。 –
@DietrichEpp 'wglGetProcAddress'が失敗した場合のフェイルセーフとして' GetProcAddress'を追加しましたが、OpenGL関数で動作しない場合は、おそらく削除します。 –
"カスタムのOpenGL関数ローダを作成して独自のカスタムゲームエンジンを設計することができます*"あなたのゲームエンジンにカスタムOpenGLローダーを作成する必要はありません。 [たくさん選ぶ](https://www.opengl.org/wiki/OpenGL_Loading_Library)。そのうちの1人があなたのニーズに対応します。 –