Ошибка при вызове функций OpenGL

Скачал с гитхаба один проект, открыл в Xcode, скачал и подключил нужные библиотеки (кроме glew, на Mac os он не нужен). Ошибок компиляции нет. Без вылетов выполняются функции glfw для создания окна, правда само окно не создается(glfwCreateWindow() возвращает nullptr). В нижеприведённом участке кода на строке

vertex = glCreateShader(GL_VERTEX_SHADER);

Происходит ошибка памяти:

Thread 1: EXC_BAD_ACCESS (code=1, address=0x1298)

Если закомментировать эту строку, ошибка будет возникать при следующем вызове функции OpenGL.

Вот код:

Shader.cpp

#include "Shader.h"

#include <exception>
#include <fstream>
#include <iostream>
#include <sstream>

#include <glm/gtc/type_ptr.hpp>

#include <OpenGL/gl3.h>
#include <GLFW/glfw3.h>

Shader::Shader(unsigned int id) : id(id){
}

Shader::~Shader(){
    glDeleteProgram(id);
}

void Shader::use(){
    glUseProgram(id);
}

void Shader::uniformMatrix(std::string name, glm::mat4 matrix){
    GLuint transformLoc = glGetUniformLocation(id, name.c_str());
    glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(matrix));
}


Shader* load_shader(std::string vertexFile, std::string fragmentFile) {

std::cerr << "vertex path: " << vertexFile << "\n";
std::cerr << "fagment path: " << fragmentFile << "\n";

// Reading Files
std::string vertexCode;
std::string fragmentCode;
std::ifstream vShaderFile;
std::ifstream fShaderFile;

vShaderFile.exceptions(std::ifstream::badbit);
fShaderFile.exceptions(std::ifstream::badbit);
try {
    vShaderFile.open(vertexFile);
    fShaderFile.open(fragmentFile);
    
    if(!vShaderFile.is_open() || !fShaderFile.is_open()){
        std::cerr << "nullptr!!\n";
    }
    
    std::stringstream vShaderStream, fShaderStream;
    
    vShaderStream << vShaderFile.rdbuf();
    fShaderStream << fShaderFile.rdbuf();
    
    vShaderFile.close();
    fShaderFile.close();
    
    vertexCode = vShaderStream.str();
    fragmentCode = fShaderStream.str();
    
    std::cerr << "vc: " << vShaderStream.str() << "\n";
    std::cerr << "fc: " << fShaderStream.str() << "\n";
    
}
catch(std::ifstream::failure& e) {
    std::cerr << "ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ" << std::endl;
    return nullptr;
}

std::cerr << "vertex code: " << vertexCode.c_str() << "\n";
std::cerr << "fragment code: " << fragmentCode.c_str() << "\n";

const GLchar* vShaderCode = vertexCode.c_str();
const GLchar* fShaderCode = fragmentCode.c_str();

GLuint vertex, fragment;
GLint success;
GLchar infoLog[512];

// Vertex Shader
vertex = glCreateShader(GL_VERTEX_SHADER); //error! Thread 1: EXC_BAD_ACCESS (code=1, address=0x1298)
glShaderSource(vertex, 1, &vShaderCode, nullptr);
glCompileShader(vertex);
glGetShaderiv(vertex, GL_COMPILE_STATUS, &success);
if (!success){
    glGetShaderInfoLog(vertex, 512, nullptr, infoLog);
    std::cerr << "SHADER::VERTEX: compilation failed" << std::endl;
    std::cerr << infoLog << std::endl;
    return nullptr;
}

// Fragment Shader
fragment = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragment, 1, &fShaderCode, nullptr);
glCompileShader(fragment);
glGetShaderiv(fragment, GL_COMPILE_STATUS, &success);
if (!success){
    glGetShaderInfoLog(fragment, 512, nullptr, infoLog);
    std::cerr << "SHADER::FRAGMENT: compilation failed" << std::endl;
    std::cerr << infoLog << std::endl;
    return nullptr;
}

// Shader Program
GLuint id = glCreateProgram();
glAttachShader(id, vertex);
glAttachShader(id, fragment);
glLinkProgram(id);

glGetProgramiv(id, GL_LINK_STATUS, &success);
if (!success){
    glGetProgramInfoLog(id, 512, nullptr, infoLog);
    std::cerr << "SHADER::PROGRAM: linking failed" << std::endl;
    std::cerr << infoLog << std::endl;
    
    glDeleteShader(vertex);
    glDeleteShader(fragment);
    return nullptr;
}

glDeleteShader(vertex);
glDeleteShader(fragment);

return new Shader(id);
}

Window.cpp если нужно

#include <iostream>
#include <OpenGL/gl3.h>
#include <GLFW/glfw3.h>
#include "Window.h"

GLFWwindow* Window::window;
int Window::width = 0;
int Window::height = 0;

int Window::initialize(int width, int height, const char* title){
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_RESIZABLE, GL_TRUE);
//glfwWindowHint(GLFW_SAMPLES, 2);

window = glfwCreateWindow(width, height, title, nullptr, nullptr);
if (window == nullptr){                            //true
    std::cerr << "Failed to create GLFW Window" << std::endl;
    glfwTerminate();
    return -1;
}
glfwMakeContextCurrent(window);

glViewport(0,0, width, height);

Window::width = width;
Window::height = height;
return 0;
}

void Window::setCursorMode(int mode){
    glfwSetInputMode(window, GLFW_CURSOR, mode);
}

void Window::terminate(){
    glfwTerminate();
}

bool Window::isShouldClose(){
    return glfwWindowShouldClose(window);
}

void Window::setShouldClose(bool flag){
    glfwSetWindowShouldClose(window, flag);
}

void Window::swapBuffers(){
    glfwSwapBuffers(window);
}

Я использую Xcode 10.3, MacOS 10.14.6 Mojave

Почему возникает эта ошибка?


Ответы (0 шт):