Программа для начинающих OpenGL продолжает сбой? - PullRequest
1 голос
/ 31 октября 2019

Я запускаю OpenGL / GLFW, и код кажется нормальным, я посмотрел онлайн и кажется правильным, однако сейчас уже поздно, поэтому я могу что-то упустить. Этот код в основном взят из курса Udemy, и я никогда раньше не запускал 3D-графику, только 2D с SFML и все. Следующий код здесь ->

#include "GL/glew.h"
#include "GLFW/glfw3.h"

#include <iostream>


//Window dimensions
const GLint SCREEN_WIDTH = 800, SCREEN_HEIGHT = 600;


int main() {
    //Initialize GLFW
    if (glfwInit() != GLEW_OK) { 
        std::cout << "GLFW init failed\n"; 
        glfwTerminate(); 
    }


    //Setup GLFW window properties
    //OpenGL version
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); //Large version
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); //Small version 
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); //Detects any old OpenGL code, this will throw an error
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); //Allows forward compatibility (between differnt OS) 


    //Creating window
    GLFWwindow* window; 
    window = glfwCreateWindow(SCREEN_WIDTH, SCREEN_HEIGHT, "OpenGL Test Window", NULL, NULL);
    if (window == NULL) {
        std::cout << "GLFW window creation failed!\n";
        glfwTerminate();
    }

    //Get buffer size information
    int BUFFER_WIDTH, BUFFER_HEIGHT;
    glfwGetFramebufferSize(window, &BUFFER_WIDTH, &BUFFER_HEIGHT);

    //Set context for GLEW to use (can change between which window)
    glfwMakeContextCurrent(window);

    //Allow modern extension features
    glewExperimental = GL_TRUE;


    if (glfwInit() != GLEW_OK) {
        std::cout << "Glew init failed!\n";
        glfwDestroyWindow(window);
        glfwTerminate();
    }


    //Setup viewport size
    glViewport(0, 0, BUFFER_WIDTH, BUFFER_HEIGHT);



    //Main game loop
    while (!glfwWindowShouldClose(window)) {
        //Get + Handle user input events
        glfwPollEvents();

        //Clear window
        glClearColor(1.f, 0.f, 0.f, 1.f);
        glClear(GL_COLOR_BUFFER_BIT);

        glfwSwapBuffers(window);
    }
}

Этот код возвращает 3 ошибки (буквально все ошибки) GLEW init failed; GLFW init failed; Window creation failed

Пожалуйста, помогите мне разобраться в чем дело, спасибо.

Ответы [ 3 ]

1 голос
/ 31 октября 2019

Есть 2 проблемы.

glfwInit возвращает GLFW_TRUE, если успешно. GLFW_TRUE равно 1. Таким образом, оно должно быть:
(Обратите внимание, что если GLFW не удалось инициализировать, то нет необходимости вызывать glfwTerminate()

if (glfwInit() != GLFW_TRUE) { 
    std::cout << "GLFW init failed\n"; 
}

ЕслиВы хотите установить GLEW , затем вам нужно позвонить glewInit, а не glfwInit. glewInit возвращает GLEW_OK в случае успеха (см. Инициализация GLEW ). GLEW_OK равно 0. Так должно быть:

glewExperimental = GL_TRUE;

if (glewInit() != GLEW_OK) {

    std::cout << "Glew init failed!\n";
    glfwDestroyWindow(window);
    glfwTerminate();
}
0 голосов
/ 31 октября 2019

Попробуйте, вам нужно инициализировать Glew.

GLenum GlewInitResult;
GlewInitResult = glewInit();
if ( GLEW_OK != GlewInitResult) 
{
    glfwTerminate();
    return -1;
}
0 голосов
/ 31 октября 2019

Это неверно:

if (glfwInit() != GLEW_OK) { 
   std::cout << "GLFW init failed\n"; 
   glfwTerminate();
}

GLEW_OK определяется как 0 (см. https://github.com/nigels-com/glew/blob/master/auto/src/glew_tail.h)

Так что это оценивается следующим образом: if (glfwInit() != 0)что будет истинно, только если GLFW правильно инициализировался.

Поэтому измените эту часть на:

if (glfwInit() == 0) { 
    std::cout << "GLFW init failed\n"; 
    glfwTerminate(); 
}
...