我正在编写一些OpenGL代码在窗口中绘制一个小点,但是当我尝试使用自己的着色器时,会收到一条我不理解的错误消息。
所以,这是我的主要功能:
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();
}
编译并运行正常,在黑色背景下显示一个小白点,如预期的那样。
现在,我想使用自己的着色器而不是默认的着色器。所以,在main函数中,就在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);
}
最后,文件" vertex-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})
答案 0 :(得分:3)
这是一个Ubuntu错误。简短的版本是,Ubuntu搞砸了他们的OpenGL软件包并引入了对pthread的依赖,即使在完全没有使用pthread的程序中也是如此。简单的解决方法是将pthread添加到要链接的库列表中。
如果使用非打包的OpenGL实现(如AMD / ATI或NVidia专有驱动程序),则会触发错误。
请参阅https://bugs.launchpad.net/ubuntu/+source/nvidia-graphics-drivers-319/+bug/1248642