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

时间:2014-02-24 03:51:27

标签: c++ opengl portability

我正在使用SuperBible v6提供的sb6 :: application框架开发一个OpenGL应用程序,虽然它在我的计算机上总能正常工作(即使我在我的DE之外运行可执行文件),我发送的其他人也没有它可以让它运行。它不是OpenGL版本的问题,因为我的朋友有v4.2。 (我有v4.3,但它是一个非常基本的程序,所以我非常怀疑我已经做了v4.3独有的任何事情)它可能与丢失的文件有关,因为窗口在他启动时立即关闭,但我无法弄清楚是什么文件。它可能是.dll或者其他东西(我假设我可以将任何所需的.dll放在与可执行文件相同的文件夹中)但我无法找出哪一个。我让我的朋友去运行DependencyWalker,我专门跟踪并向他发送了DependencyWalker说他失踪的那些,但仍然没有改进。

SuperBible绝对没有关于sb6 :: application类的文档,也没有提供有关如何设置可移植项目的任何信息。或者如果确实如此,即使经过数天的搜索,我也无法找到它。

不确定代码的哪些部分与post相关,但这里是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);

}

1 个答案:

答案 0 :(得分:0)

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

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

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

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

SFML - 似乎是SDL的变种。说实话,我之前没有用过这个,但如果你喜欢它,请告诉我它是怎么回事!

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