簡體   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