我目前正在尝试创建自定义OpenGL函数加载器,以便可以开始设计自己的自定义游戏引擎。包含所有加载程序代码的 header 的格式如下:

#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");
    // ...
}

如果我在自己的#include "SWOGLL.h"文件中添加了main.cpp,则在创建OpenGL上下文后调用GenerateGLFunctionPointers()的情况下,OpenGL函数可以正常工作。

但是,如果我创建了一个单独的文件和#include "SWOGLL.h",即使已经创建了OpenGL上下文,OpenGL函数也将完全不起作用。

这是什么问题

最佳答案

您在头文件中声明static函数和变量。除非您有非常特殊的理由要做如此奇怪的事情,否则不要这样做。

static PFNGLACTIVESHADERPROGRAMPROC glActiveShaderProgram;

static void* GetGLFunctionPointer(const char* functionName)

这将在每个包含 header 的C++文件中创建glActiveShaderProgramGetGLFunctionPointer()和其他所有声明为static的副本。

删除static,然后执行以下操作之一:
  • 将声明保留在标题中,但将定义移至C++文件。
  • 将声明和定义保留在标题中,但将其标记为inline。这不适用于全局变量。

  • 在这种情况下,使用static关键字可以使声明为static的函数和变量具有“内部链接”,这意味着,每个定义它们的C++文件都会获得它们的单独副本。这与声明成员函数static完全不同,后者的效果完全不同。不幸的是,关键字static在不同位置表示不同的事物。这就是生活。

    关于c++ - 当包含加载程序 header 时,为什么不能使用OpenGL函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39578206/

    10-11 23:04
    查看更多