繁体   English   中英

调用 glCreateShader 时出现运行时错误“线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x0)”

[英]Getting runtime error "Thread 1: EXC_BAD_ACCESS (code=1, address=0x0)" whencalling glCreateShader

我正在尝试编译着色器程序,但收到上面指定的运行时错误消息。 我已经尝试了一段时间来弄清楚为什么会发生这种情况以及它意味着什么,但我很困惑。

这是相关的源代码:

主.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"};
}

着色器.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, &srcShader, nullptr);
    glCompileShader(shader);
    
    // Check for compilation failure
    int  success;
    char infoLog[512];
    glGetShaderiv(shader, GL_COMPILE_STATUS, &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 string& vertexShaderFilepath,
               const string& 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 string& vertexShaderFilepath,
           const string& fragmentShaderFilepath);
    void activate();
    void activateWithUniform(const string& uniformName, float uniformVal);
    void activateWithUniform(const string& uniformName, int uniformVal);
    
private:
    enum class ShaderType { vertex, fragment };
    
    static string shaderFromFile(const string& filepath);
    static unsigned int compileShader(ShaderType shaderType, const char* srcShader);
    static unsigned int linkShaders(unsigned int shader1, unsigned int shader2);
    
    unsigned int shaderProgram {};
};

这是显示我链接的库的屏幕截图。

显示我正在链接的库的屏幕截图

我应该提到着色器是程序中唯一不起作用的东西 - 如果我注释掉着色器,程序的其余部分将输出一个带有绿色背景的窗口。 这是完整的源代码,但我希望上面的代码片段足以提供所需的信息。

您应该在 GLAD 和 GLEW 之间进行选择,但不要同时使用两者:GLEW 附带了自己的 OpenGL 符号集,但您没有调用 glewInit,因此它们保持在 0x0。 删除 libGLEW 库或 GLAD 代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM