#c #macos #opengl #glfw
#c #macos #opengl #glfw
Вопрос:
Я пытаюсь скомпилировать шейдерную программу, но получаю сообщение об ошибке во время выполнения, указанное выше. Я некоторое время пытался выяснить, почему это происходит и что это значит, но я довольно застрял.
Вот соответствующий исходный код:
Main.cpp:
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include "shader.hpp"
void initGLFW() {
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
#ifdef __APPLE__
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
#endif
}
GLFWwindow* createWindow(int width, int height) {
GLFWwindow* window = glfwCreateWindow(width, height, "LearnOpenGL", NULL, NULL);
if (window == NULL) {
throw runtime_error("Failed to create GLFW window");
}
glfwMakeContextCurrent(window);
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
return window;
}
int main() {
initGLFW();
GLFWwindow* window = createWindow(WIDTH, HEIGHT);
initGLAD();
Shader sh {"vertex-shader.txt", "fragment-shader.txt"};
}
Shader.cpp
unsigned int Shader::compileShader(ShaderType shaderType, const char* srcShader) {
unsigned int shader {};
string shaderStr {};
if (shaderType == ShaderType::vertex) {
shader = glCreateShader(GL_VERTEX_SHADER); // THIS IS WHERE THE RUNTIME ERROR COMES UP
shaderStr = "Vertex";
}
else if (shaderType == ShaderType::fragment) {
shader = glCreateShader(GL_FRAGMENT_SHADER);
shaderStr = "Fragment";
}
glShaderSource(shader, 1, amp;srcShader, nullptr);
glCompileShader(shader);
// Check for compilation failure
int success;
char infoLog[512];
glGetShaderiv(shader, GL_COMPILE_STATUS, amp;success);
if (!success) {
glGetShaderInfoLog(shader, 512, nullptr, infoLog);
ostringstream oss {};
oss << shaderStr << " shader compilation failed.n" << infoLog << endl;
throw runtime_error(oss.str());
}
return shader;
}
Shader::Shader(const stringamp; vertexShaderFilepath,
const stringamp; fragmentShaderFilepath)
{
string srcVertexShader {shaderFromFile(vertexShaderFilepath)};
string srcFragmentShader {shaderFromFile(fragmentShaderFilepath)};
const char* srcVS_cstr = srcVertexShader.c_str();
const char* srcFS_cstr = srcFragmentShader.c_str();
unsigned int vertexShader = compileShader(ShaderType::vertex, srcVS_cstr);
unsigned int fragmentShader = compileShader(ShaderType::fragment, srcFS_cstr);
shaderProgram = linkShaders(vertexShader, fragmentShader);
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
}
// More stuff in shader.cpp, I only included relevant bits of code.
Shader.hpp (в основном не имеет значения):
#include <string>
using namespace std;
class Shader {
public:
Shader(const stringamp; vertexShaderFilepath,
const stringamp; fragmentShaderFilepath);
void activate();
void activateWithUniform(const stringamp; uniformName, float uniformVal);
void activateWithUniform(const stringamp; uniformName, int uniformVal);
private:
enum class ShaderType { vertex, fragment };
static string shaderFromFile(const stringamp; filepath);
static unsigned int compileShader(ShaderType shaderType, const char* srcShader);
static unsigned int linkShaders(unsigned int shader1, unsigned int shader2);
unsigned int shaderProgram {};
};
Вот скриншот, показывающий, какие библиотеки я связал.
Я должен упомянуть, что шейдеры — это единственное, что не работает в программе — если я закомментирую шейдер, остальная часть программы выведет окно с зеленоватым фоном. Вот полный исходный код, но я надеюсь, что приведенных выше фрагментов кода достаточно, чтобы предоставить необходимую информацию.
Комментарии:
1. Как отлаживать небольшие программы
2. @S.M. wikihow.com/Be-a-Good-Person
Ответ №1:
Вы должны выбирать между GLAD и GLEW, но не использовать оба: GLEW поставляется со своим собственным набором символов для OpenGL, но вы не вызываете glewInit, поэтому они остаются равными 0x0. Либо удалите библиотеку libGLEW, либо код GLAD.
Комментарии:
1. Спасибо, я удалил библиотеку GLEW, но, к сожалению, я все еще получаю ту же ошибку во время выполнения.
2. Подключите отладчик и отредактируйте свой вопрос с помощью трассировки стека функции сбоя. (в виде текста!)