c - 创建库时如何正确初始化GLEW?

标签 c opengl glew

我创建了一个与 OpenGL 一起使用的库,其代码提供 here .

它编译得很好,似乎没有什么问题,但是当我将它与测试程序一起使用时,它显示一个异常,位置 0x00000000 处的访问冲突(这显然是由于 GLEW 没有被已初始化)。

但是 GLEW 已经在库中初始化,请从上面提供的链接中的源代码中查看 window.c 中 LIB_CreateWindow 的函数定义。

此外,如果我尝试使用 OpenGL 使用库绘制一些内容,它只显示一个空白屏幕。

测试程序代码:- (main.c)

#define GLEW_STATIC
#include <GL/glew.h>
#include <window.h>
#include <stddef.h>
#include <lib_window.h>
#include <lib_test_draw.h>

int main()
{
    // Initialize the library...
    LIB_Initialize();

    // Get center position...
    LIB_Vector2i size; LIB_GetDisplaySize(&size);
    // Create the window...
    LIB_Window * window = LIB_CreateWindow("BLITZ Test", LIB_CreateVector2i((size.x - 1024) / 2, (size.y - 768) / 2),
        LIB_CreateVector2i(1024, 768), LIB_FALSE, LIB_FALSE, LIB_DRAWMODE_FIXED, LIB_USE_DEFAULT_CONTEXT_SETTINGS);

    // Adding these two lines again removes the exception...
    glewExperimental = GL_TRUE;
    glewInit(); // Why initialize GLEW again?

    // Use OpenGL to do cool stuff...
    LIB_TemporaryCreate();

    while (LIB_IsWindowOpened(window))
    {
        LIB_BeginRender(LIB_SetColorRGB(0, 0, 0));
        // Draw it all here...
        LIB_TemporaryRender();
        LIB_EndRender(window);
    }
    // Destroy the current window...
    LIB_DestroyWindow(window);
    // Terminate library...
    LIB_Terminate();
    return 0;
}

我在库中创建了一个测试文件,以测试如果从库本身调用它是否可以绘制任何内容,但它只显示空白屏幕,但没有异常(exception)。

lib_test_draw.h

#ifndef LIB_TEST_DRAW
#define LIB_TEST_DRAW

#define GLEW_STATIC
#include <GL/glew.h>
#include <stddef.h>
#include <stdio.h>

const char * vertex_src =
"#version 330 core\n"
"layout (location = 0) in vec3 pos;\n"
"void main()\n"
"{\n"
"gl_Position = vec4(pos, 0.0f);\n"
"}\0";

const char * fragment_src =
"#version 330 core\n"
"out vec4 Color;\n"
"void main()\n"
"{\n"
"Color = vec4(1.0f, 0.0f, 0.0f, 1.0f);\n"
"}\0";

GLuint shdr_prg;
GLuint VAO;
GLuint VBO;

void CreateProgram(const char * vertex_shdr_src, const char * frag_shdr_src, GLuint * prg)
{
    GLuint vertex_shdr = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertex_shdr, 1, &vertex_shdr_src, NULL);
    glCompileShader(vertex_shdr);

    GLuint frag_shdr = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(frag_shdr, 1, &frag_shdr_src, NULL);
    glCompileShader(frag_shdr);

    // Checking if glCreateProgram was successful.
    if (glCreateProgram() == 0)
    {
        printf("Error creating program!\n");
    }

    *prg = glCreateProgram();
    glAttachShader(*prg, vertex_shdr);
    glAttachShader(*prg, frag_shdr);
    glLinkProgram(*prg);

    glDeleteShader(vertex_shdr);
    glDeleteShader(frag_shdr);
}

void LIB_TemporaryCreate()
{
    CreateProgram(vertex_src, fragment_src, &shdr_prg);
    GLfloat vertices[] =
    {
        -0.5f,  -0.5f,  0.0f,
         0.5f,  -0.5f,  0.0f,
         0.0f,   0.5f,  0.0f
    };

    glGenVertexArrays(1, &VAO);
    glGenBuffers(1, &VBO);

    glBindVertexArray(VAO);

    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid *)0);
    glEnableVertexAttribArray(0);

    glBindBuffer(GL_ARRAY_BUFFER, 0);

    glBindVertexArray(0);
}

void LIB_TemporaryRender()
{
    glUseProgram(shdr_prg);
    glBindVertexArray(VAO);
    glDrawArrays(GL_TRIANGLES, 0, 3);
    glBindVertexArray(0);
}

#endif /* LIB_TEST_DRAW */

最佳答案

好的,...解决了问题,

GLEW 库需要在源文件外部初始化(使用它的程序无法访问!)。

这就是为什么您需要再次初始化 GLEW,因为一旦编译完成,程序就无法找到(也无法访问)库源文件内完成的初始化。

你可以!但是在头文件中初始化它才能工作!

感谢@Spektre帮助我指出这个问题。

关于c - 创建库时如何正确初始化GLEW?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49504471/

相关文章:

c++ - C 与 C++ 结构对齐

c - 在带有 GLFW 的 OpenGL 中,major 和 minor 是什么意思?

c++ - 如果我使用 Glew,是否需要手动处理所有这些代码?

C 没有可用于编程的内存 : unsafe to call malloc error

c - 计算循环期间出现段错误

c - 在 openGL 中显示顶点

wpf - 跨平台 2D 矢量 + 光栅 API + 硬件加速 - 这存在吗?

c++ - 访问正在运行的线程

c - 为什么 C 没有成为独立于平台的语言?

opengl - 将 uint 属性传递给 GLSL