c++ - 如何使 OpenGL SuperBible 6 应用程序可移植?

标签 c++ opengl portability

我正在使用 SuperBible v6 提供的 sb6::application 框架开发一个 OpenGL 应用程序,尽管它在我的计算机上始终运行良好(即使我在我的 DE 之外运行可执行文件),但我发送的其他人都没有它可以让它运行。这不是 OpenGL 版本的问题,因为我的 friend 有 v4.2。 (我有 v4.3,但它是一个非常基本的程序,所以我非常怀疑我是否做了 v4.3 独有的任何事情)它可能与丢失的文件有关,因为窗口在他启动时立即关闭,但我无法弄清楚是什么文件。它可能是一个 .dll 或其他东西(我假设我可以将任何需要的 .dll 放在与可执行文件相同的文件夹中)但我一直无法找出是哪个。我让我的 friend 跑了DependencyWalker,我特意找了下DependencyWalker说他漏的发给他,还是没有改善。

SuperBible 绝对没有关于 sb6::application 类的文档,也没有提供任何关于如何设置项目以使其可移植的信息。或者即使找到了,我也找不到它,即使经过几天的搜索。

不确定代码的哪些部分与发布相关,但这里是 sb6::application 类的 init() 和 startup() 函数。

void init()
{
    // Redirect output to this file.
    //freopen("myoutput.txt", "w", stdout);

    ready = false;

    static const char title[] = "Forkits";

    sb6::application::init();

    memcpy(info.title, title, sizeof(title));

}

void save_viewport_size()
{
    // Get the size of the window
    glGetIntegerv(GL_VIEWPORT, m_viewport);
    std::cout << m_viewport[0] << " " << m_viewport[1] << " " << m_viewport[2] << " " << m_viewport[3] << std::endl;
}

void startup(void)
{

    // Check version
    GLint version = 0;
    //glGetFloatv(GL_VERSION, &version);
    //glGetIntegerv(GL_VERSION, &version);
    //std::cout << "Version number " << glGetString(GL_VERSION) << std::endl;
    //printf("%s %s\n", glGetString(GL_RENDERER), glGetString(GL_VERSION));

    // Save the size of the initial viewport
    glGetIntegerv(GL_VIEWPORT, m_viewport);
    std::cout << m_viewport[0] << " " << m_viewport[1] << " " << m_viewport[2] << " " << m_viewport[3] << std::endl;

    program = glCreateProgram();
    GLuint vs = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vs, 1, vs_source, NULL);
    glCompileShader(vs);

    print_shader_log(vs);

    GLuint fs = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fs, 1, fs_source, NULL);
    glCompileShader(fs);

    print_shader_log(fs);

    glAttachShader(program, vs);
    glAttachShader(program, fs);

    glLinkProgram(program);

    print_linker_log(program);

    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);

    // Set parameters
    glSamplerParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glSamplerParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glSamplerParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);

    // Set up alpha blending
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    ready = true;
    flag_running = true;

    int init_success = Forkits::init(&sprites);

    logic = new std::thread(old_main);

}

最佳答案

你是对的,你应该能够将 .dll 放在与可执行文件相同的目录中并且它会工作。 sb6 可能依赖于您拥有但您的 friend 没有的其他 .dll。或者更可能的是,您 friend 的 .dll 已过时。这是一种调查途径。有趣的是,窗口成功打开,然后关闭。对我来说,这表明设置 OpenGL 上下文存在问题。你能发布你调用的代码来设置 OpenGL 吗?

在我看来,另一个更好的方法是从您的应用程序中完全删除 sb6 并切换到另一个更便携的应用程序框架。 Sb6 仅用于练习,如果你想要一个更健壮的框架,我会切换。由于您只使用 sb6 完成了一个小项目,现在也是转换的绝佳时机,因为代码更改将是最小的并且(相对 :))无痛。以下是我推荐的几个库:

SDL - 我个人的最爱。它会做所有事情,从设置窗口、处理输入、网络、播放声音,甚至线程。而且它(声称)是完全便携的。但是,请注意。他们刚刚经历了一次重大更新(1.2 到 2.0),文档还没有完全跟上。

GLFW - 如果您正在制作专用的 OpenGL 应用程序,这可能是更好的选择。由于它是为与 OpenGL 一起工作而从头开始构建的(与 SDL 不同,SDL 首先是一个窗口框架并且不关心您在窗口中放置什么)它可以更快地设置为与 OpenGL 一起工作。

SFML - 似乎是 SDL 的变体。老实说,我以前没用过这个,但如果你喜欢,请告诉我它怎么样!

还有其他的,但这些是我听说过的三大巨头。如果您对运行它们有任何疑问,请告诉我。

关于c++ - 如何使 OpenGL SuperBible 6 应用程序可移植?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21978567/

相关文章:

python - 无法正确转换 OBJ 或 OpenGL 无法很好地绘制对象

c - 大型 C 程序的 GUI 方法

python - 适用于 Python 中任何平台的 Unix 路径?

c++ - 是否应该避免 Eigen 不支持的模块?

android - Cocos2d-x C++开发工具(无需完整的IDE)

c++ - 遍历容器的最佳方式

c++ - 我如何增加一个数字,停止它,在 C++ 上使用 if/else 语句?

OpenGL 投影裁剪

c - 像 "GLenum GlewInitResult = glewInit();"这样的声明(?)是做什么的?

static - 如何强制使用静态库而不是共享?