簡體   English   中英

當包含加載程序標頭時,為什么不能使用OpenGL函數?

[英]Why am I not able to use OpenGL functions when I include my loader header?

我目前正在嘗試創建自定義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上下文后調用了GenerateGLFunctionPointers()的情況下,OpenGL函數可以正常工作。

但是,如果我創建一個單獨的文件並#include "SWOGLL.h" ,即使已經創建了OpenGL上下文,OpenGL函數也將完全不起作用。

這是什么問題

您在頭文件中聲明static函數和變量。 除非您有非常特別的理由要做如此奇怪的事情, 否則不要這樣做

static PFNGLACTIVESHADERPROGRAMPROC glActiveShaderProgram;

static void* GetGLFunctionPointer(const char* functionName)

這將創建glActiveShaderProgramGetGLFunctionPointer()其他副本,以及在包含標頭的每個C ++文件中聲明為static其他所有副本。

刪除static ,然后執行下列操作之一:

  1. 將聲明保留在標題中,但將定義移至C ++文件。

  2. 將聲明和定義保留在標題中,但將它們標記為inline 這不適用於全局變量。

在這種情況下,使用static關鍵字可以使聲明為static的函數和變量具有“內部鏈接”,這意味着,每個定義它們的C ++文件都會獲得它們的單獨副本。 這與聲明成員函數static ,后者具有完全無關的作用。 不幸的是關鍵字static在不同的地方意味着不同的事物。 這就是生活。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM