Ошибка при вызове функций 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
Почему возникает эта ошибка?