2015-06-20 55 views
1

我正在編寫一些OpenGL代碼在窗口中繪製一個小點,但是當我嘗試使用自己的着色器時,出現一條錯誤消息理解。GLSL着色器運行時錯誤:由ld.so檢測到的不一致性

所以,這裏是我的主要功能:

int main(int argc, char** argv) 
{ 
    // Initialize some things 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA); 
    glutInitWindowSize(100, 100); 
    glutCreateWindow("OpenGL Test"); 
    glutDisplayFunc(RenderScene); 
    glewInit(); 
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 

    // Make the vertex buffer 
    Vector3f vertices[1]; 
    vertices[0] = Vector3f(0.0f, 0.0f, 0.0f); 
    glGenBuffers(1, &vertex_buffer); 
    glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); 

    // Main GLUT loop 
    glutMainLoop(); 
} 

這是我的渲染回調函數:

static void RenderScene() 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 
    glEnableVertexAttribArray(0); 
    glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); 
    glDrawArrays(GL_POINTS, 0, 1); 
    glDisableVertexAttribArray(0); 
    glutSwapBuffers(); 
} 

這編譯並運行良好,在黑色背景上顯示一個白色的小點,符合市場預期。

現在,我想使用自己的着色器而不是默認的着色器。因此,在主函數中,只是glutMainLoop()之前,包括我行:

MakeShaderProgram("vertex-shader.glsl"); 

而這個函數的定義爲:

static void MakeShaderProgram(std::string shader_filename) 
{ 
    GLuint program = glCreateProgram(); 
    GLuint shader = glCreateShader(GL_VERTEX_SHADER); 
    const GLchar* ptr_filename = &shader_filename[0]; 
    const GLchar** ptr_filenames = &ptr_filename; 
    int filename_lengths[] = {1}; 
    glShaderSource(shader, 1, ptr_filenames, &filename_lengths[0]); 
    glCompileShader(shader); 
    glAttachShader(program, shader); 
    glLinkProgram(program); 
    glUseProgram(program); 
} 

最後文件「頂點shader.glsl」,這位於同一目錄中的可執行文件,具有下列內容:

#version 330 

layout (location = 0) in vec3 Position; 

void main() 
{ 
    gl_Position = vec4(0.5 * Position.x, 0.5 * Position.y, Position.z, 1.0); 
} 

現在,編譯,這是好的。但是,在運行時,我收到以下錯誤:

Inconsistency detected by ld.so: dl-version.c: 224: _dl_check_map_versions: Assertion `needed != ((void *)0)' failed! 

程序在主函數啓動後立即斷開。我不知道這個錯誤消息是什麼意思,但它是由嘗試使用我自己的着色器而不是默認着色器造成的。

有人可以解釋發生了什麼問題嗎?

如果是相關的,這是我CMakeLists.txt文件:

cmake_minimum_required(VERSION 2.8.1) 

set(CMAKE_CXX_FLAGS "-std=c++11") 

project(OpenGLTest) 

find_package(OpenGL REQUIRED) 
find_package(GLEW REQUIRED) 
find_package(GLUT REQUIRED) 

include_directories(${OPENGL_INCLUDE_DIR} ${GLEW_INCLUDE_DIR} ${GLUT_INCLUDE_DIR}) 

file(GLOB SRCS *.cpp) 

add_executable(${PROJECT_NAME} ${SRCS}) 

target_link_libraries(${PROJECT_NAME} ${OPENGL_LIBRARIES} ${GLEW_LIBRARY} ${GLUT_LIBRARY}) 

回答

相關問題