簡體   English   中英

代碼錯誤:線程1:EXC_BAD_ACCESS(代碼= 1,地址= 0x0)

[英]code error : Thread 1: EXC_BAD_ACCESS (code=1, address=0x0)

我正在嘗試使用OpenGL在C ++中編寫代碼(我使用GLFW和GLEW庫)。 這是代碼:

#include <GL/glew.h>
#include <GLFW/glfw3.h>

#define numVAOs 1

GLuint renderingProgram;
GLuint vao[numVAOs];

GLuint createShaderProgram(){
    const char*vshaderSource =
    "#version 430 \n"
    "void main(void) \n"
    "{gl_Position = vec4(0.0,0.0,0.0,1.0)};";
    const char*fshaderSource =
    "#version 430 \n"
    "out vec4 color; \n"
    "void main(void) \n"
    "{gl_Position = vec4(0.0,0.0,1.0,1.0)};";

    GLuint vShader = glCreateShader(GL_VERTEX_SHADER);
    GLuint fShader = glCreateShader(GL_FRAGMENT_SHADER);

    glShaderSource(vShader,1,&vshaderSource,NULL);
    glShaderSource(fShader,1,&fshaderSource,NULL);
    glCompileShader(vShader);
    glCompileShader(fShader);

    GLuint vfProgram = glCreateProgram();
    glAttachShader(vfProgram,vShader);
    glAttachShader(vfProgram,fShader);
    glLinkProgram(vfProgram);
    return vfProgram;

}



int main()
{

    glfwInit();

    // Define version and compatibility settings
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
    glfwWindowHint(GLFW_OPENGL_PROFILE,GLFW_OPENGL_CORE_PROFILE);
    glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
    glGenVertexArrays(numVAOs,vao);
    glBindVertexArray(vao[0]);
    glUseProgram(renderingProgram);
    glDrawArrays(GL_POINT,0,1);
    // Create OpenGL window and context
    GLFWwindow* window = glfwCreateWindow(1430, 800, "Davide", NULL, NULL);
    glfwMakeContextCurrent(window);

    // Check for window creation failure
    if (!window)
    {
        // Terminate GLFW
        glfwTerminate();
        return 0;
    }


    glewExperimental = GL_TRUE; glewInit();

    // Event loop
    while(!glfwWindowShouldClose(window))
    {
        // Clear the screen to black
        glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT);
        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    // Terminate GLFW
    glfwTerminate(); return 0;
}

不幸的是,當我運行代碼時,我得到一個錯誤代碼:

Thread 1: EXC_BAD_ACCESS (code = 1, address = 0x0).

它應該出現一個黑屏,中間有一個點。

多個問題:

  1. 在擁有當前GL上下文之前,您要先調用GL函數:

     glGenVertexArrays(numVAOs,vao); // nope glBindVertexArray(vao[0]); // nope glUseProgram(renderingProgram); // nope glDrawArrays(GL_POINT,0,1); // nope // Create OpenGL window and context GLFWwindow* window = glfwCreateWindow(1430, 800, "Davide", NULL, NULL); glfwMakeContextCurrent(window); 

    搬完調用 glfwMakeContextCurrent()和你的GL裝載機初始化),所以他們有一個GL上下文進行操作(和檢查,如果window為空在使用它之前 glfwMakeContextCurrent()

     // Create OpenGL window and context GLFWwindow* window = glfwCreateWindow(1430, 800, "Davide", NULL, NULL); // Check for window creation failure if (!window) { // Terminate GLFW glfwTerminate(); return 0; } glfwMakeContextCurrent(window); glewExperimental = GL_TRUE; glewInit(); glGenVertexArrays(numVAOs,vao); glBindVertexArray(vao[0]); glUseProgram(renderingProgram); glDrawArrays(GL_POINT,0,1); 
  2. 您還應該在glUseProgram()之前初始化renderingProgram ,也許使用createShaderProgram()進行createShaderProgram()

  3. gl_Position在片段着色器中無效。 您正在考慮gl_Color或用戶定義的輸出(例如color輸出)。

  4. 如果您請求GL 3.2上下文,則#version 430也不有效。 升級到GL 4.3或將着色器降級到#version 150

  5. GL_POINT不是glDrawArrays()的有效輸入。 您正在考慮GL_POINTS

  6. 每幀調用一次glDrawArrays()而不是在繪制循環開始時調用一次,這樣您就有機會真正看到您的觀點。

  7. GLSL語句后面需要分號。

    無效:

     void main(void) { gl_Position = vec4(0.0,0.0,0.0,1.0) }; 

    有效:

     void main(void) { gl_Position = vec4(0.0,0.0,0.0,1.0); // note the semicolon } // note the lack of semicolon 

全部一起:

黑色窗口中間的藍點屏幕截圖

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>

void CheckStatus( GLuint obj, bool isShader )
{
    GLint status = GL_FALSE, log[ 1 << 11 ] = { 0 };
    ( isShader ? glGetShaderiv : glGetProgramiv )( obj, isShader ? GL_COMPILE_STATUS : GL_LINK_STATUS, &status );
    if( status == GL_TRUE ) return;
    ( isShader ? glGetShaderInfoLog : glGetProgramInfoLog )( obj, sizeof( log ), NULL, (GLchar*)log );
    std::cerr << (GLchar*)log << "\n";
    std::exit( EXIT_FAILURE );
}

void AttachShader( GLuint program, GLenum type, const char* src )
{
    GLuint shader = glCreateShader( type );
    glShaderSource( shader, 1, &src, NULL );
    glCompileShader( shader );
    CheckStatus( shader, true );
    glAttachShader( program, shader );
    glDeleteShader( shader );
}

const char* const vert = 1 + R"GLSL(
#version 150
void main()
{
    gl_Position = vec4(0.0,0.0,0.0,1.0);
}
)GLSL";

const char* const frag = 1 + R"GLSL(
#version 150
out vec4 color;
void main()
{
    color = vec4(0.0,0.0,1.0,1.0);
}
)GLSL";

#define numVAOs 1

GLuint renderingProgram;
GLuint vao[ numVAOs ];

int main()
{
    glfwInit();

    // Define version and compatibility settings
    glfwWindowHint( GLFW_CONTEXT_VERSION_MAJOR, 3 );
    glfwWindowHint( GLFW_CONTEXT_VERSION_MINOR, 2 );
    glfwWindowHint( GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE );
    glfwWindowHint( GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE );
    glfwWindowHint( GLFW_RESIZABLE, GL_FALSE );
    // Create OpenGL window and context
    GLFWwindow* window = glfwCreateWindow( 320, 240, "Davide", NULL, NULL );
    // Check for window creation failure
    if( !window )
    {
        // Terminate GLFW
        glfwTerminate();
        return 0;
    }
    glfwMakeContextCurrent( window );

    glewExperimental = GL_TRUE;
    glewInit();

    glGenVertexArrays( numVAOs, vao );
    glBindVertexArray( vao[ 0 ] );

    GLuint renderingProgram = glCreateProgram();
    AttachShader( renderingProgram, GL_VERTEX_SHADER, vert );
    AttachShader( renderingProgram, GL_FRAGMENT_SHADER, frag );
    glLinkProgram( renderingProgram );
    CheckStatus( renderingProgram, false );
    glUseProgram( renderingProgram );

    // Event loop
    while( !glfwWindowShouldClose( window ) )
    {
        // Clear the screen to black
        glClearColor( 0.0f, 0.0f, 0.0f, 1.0f );
        glClear( GL_COLOR_BUFFER_BIT );
        glDrawArrays( GL_POINTS, 0, 1 );
        glfwSwapBuffers( window );
        glfwPollEvents();
    }

    // Terminate GLFW
    glfwTerminate();
    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM