Неопределенные идентификаторы с glfw - PullRequest
0 голосов
/ 04 августа 2020
#include <iostream>
#include <GLFW/glfw3.h>
#include <math.h>

const GLchar* vertex120 = R"END(
#version 120
uniform mat4 matrix;
attribute vec4 inColor;
attribute vec4 inPosition;
varying vec4 outColor;
void main()
{
    outColor = inColor;
    gl_Position = matrix * inPosition;
}
)END";

int main() {
    GLFWwindow* window;

    if (!glfwInit()) {
        std::cout << "Init error";
        exit(-1);
    }

    window = glfwCreateWindow(800, 800, "Hello", 0, 0);
    if (!window) {
        std::cout << "Window creation error";
        glfwTerminate();
        exit(-1);
    }

    glfwMakeContextCurrent(window);

    GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertexShader, 1, &vertex120, 0);
    glCompileShader(vertexShader);

    GLint compilationStatus;
    glGetShaderiv(vertexShader, GL_COMPLIE_STATUS, &compilationStatus);
    if (compilationStatus == GL_FALSE) {
        GLchar message[256];
        glGetShaderInfoLog(vertexShader, sizeof(message), 0, &message[0]);
        std::cout << message;
        exit(-1);
    }

    while (!glfwWindowShouldClose(window)) { 

        glClearColor(0, 0, 0, 0);
        glClear(GL_COLOR_BUFFER_BIT);

        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    glfwTerminate();
}

Я следую руководству по использованию opengl, все работало до тех пор, пока не появился код выше, в котором я получаю неопределенные ошибки для GLchar *, glCreateShader, glShaderSource. Все остальное работает, поэтому я не смог понять, что не так, пожалуйста, помогите.

1 Ответ

1 голос
/ 05 августа 2020

OpenGL реализуется графическим драйвером как набор реализованных функций, а не как отдельная библиотека, поэтому его нельзя просто связать с вашим проектом. Чтобы вызвать функцию, вы должны запросить у OpenGL указатель на эту функцию, и вы должны сделать это со всеми функциями, которые вы будете вызывать.

Вы можете сделать это с помощью таких функций, как GetProcAddress ... но это зависит от на платформе, для которой вы разрабатываете. чтобы получить указатель на функцию для всех этих функций, это утомительная работа, для этого есть несколько библиотек, таких как GLEW / GLAD, чтобы делать это во время выполнения из драйвера для каждой функции OpenGL.

так что именно это и происходит с вашим кодом ваша программа не знает, что это за glCreateShader, чтобы исправить это, вам нужна только строка magi c в вашем коде, которая

 #include <gl/glew.h>
 #include <GLFW/glfw3.h>

, обратите внимание, что вам нужно включить GLEW перед GLFW. и ваша программа распознает функции.

также вам необходимо инициализировать GLEW после создания контекста, вы можете сделать это следующим образом:

    glewExperimental = GL_TRUE; //to avoid using the deprecated GL functions
    if (glewInit() != GLEW_OK) {
        std::cerr << "GLEW::Error : failed to initialize GLEW"<< std::endl;
    }

И не надо ' Забудьте о библиотеке, связывающей часть . Я нашел здесь руководство по установке GLEW с помощью Visual Studio http://www.mcihanozer.com/tips/setting-up-libraries/setting-up-glew-for-visual-studio/ и для загрузки GLEW http://glew.sourceforge.net/

PS: использовать GLEW в качестве динамического * Библиотека 1029 * (DLL) может вызвать некоторые проблемы, в этом случае вы можете использовать версию stati c, например, набрав #define GLEW_STATI C в начале вашего кода, а при связывании поместите stati c версия библиотеки. это просто пример с GLEW, который немного старше, чем GLAD, если вы sh используете GLAD, это тоже отличный вариант.

...