丢失的OpenGL输出
Lost OpenGL output
一周前我将我的操作系统升级到最新版本,所以GLEW, nVidia驱动程序,g++, Qt等也都升级了。那是我的QGLWidget
停止显示原始OpenGL 3.3内容的日子,只有基于2D QPainter
的东西。由于我的机器上没有其他OpenGL应用程序(包括我的DE)受到影响,我一定在我的应用程序中编写了一些可疑的代码,这可能是这些库的旧版本所允许的——现在已经修改了。
我有很多非常抽象的OpenGL代码,所以有很多潜在的失败的地方;经过几天的尝试从它得到任何类型的输出(glGetError()
没有返回错误之前,我开始搞乱它),我决定最好的事情是写最简单的OpenGL应用程序,然后慢慢构建它,直到它崩溃。
但是我甚至不能让一个三角形出现!
void Viewer::initializeGL()
{
// Initialise GLEW, compile/link fragment and vertex shaders, error check, etc.
...
// Create default VAO.
glGenVertexArrays( 1, &vao_ );
glBindVertexArray( vao_ );
glUseProgram( shader_ );
vVertex_ = glGetAttribLocation( shader_, "vVertex" );
// Create the test triangle VBO.
glGenBuffers( 1, &vbo_ );
glBindBuffer( GL_ARRAY_BUFFER, vbo_ );
glEnableVertexAttribArray( vVertex_ );
glVertexAttribPointer( vVertex_, 3, GL_FLOAT, false, 0,
reinterpret_cast< GLvoid* >( 0 ) );
// Upload the data to the GPU.
static const float verts[9] = { 0.0f, 0.0f, -0.5f,
1.0f, 0.0f, -0.5f,
0.5f, 1.0f, -0.5f };
glBufferData( GL_ARRAY_BUFFER, sizeof( verts ),
static_cast< const void* >( verts ), GL_STATIC_DRAW );
glBindBuffer( GL_ARRAY_BUFFER, GL_NONE );
glDisableVertexAttribArray( vVertex_ );
Sy_GL::checkError();
}
void Viewer::paintGL()
{
// Clear the buffers.
qglClearColor( QColor( Qt::black ) );
glClear( GL_COLOR_BUFFER_BIT );
glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
glBindBuffer( GL_ARRAY_BUFFER, vbo_ );
glEnableVertexAttribArray( vVertex_ );
glVertexAttribPointer( vVertex_, 3, GL_FLOAT, false, 0,
reinterpret_cast< GLvoid* >( 0 ) );
glDrawArrays( GL_TRIANGLES, 0, 3 );
glBindBuffer( GL_ARRAY_BUFFER, GL_NONE );
glDisableVertexAttribArray( vVertex_ );
Sy_GL::checkError();
}
我没有使用我的VAO,因为VAO不能跨上下文共享,这是我的"真实"应用程序中的场景,所以我在这里复制了这种情况。Sy_GL::checkError()
只调用glGetError()
,如果有问题则抛出异常。我的两个着色器不能再简单了:
// Vertex shader.
#version 330
in vec3 vVertex;
void main( void )
{
gl_Position = vec4( vVertex, 1.0 );
}
// Fragment shader (in different file).
#version 330
out vec4 fragColour;
void main( void )
{
fragColour = vec4( 1.0, 0.0, 0.0, 1.0 );
}
这应该在黑色背景下显示一条红线渲染的三角形,但我只得到黑色背景-没有控制台输出或异常。我的系统确实支持OpenGL 3.3和更高版本,这是我的glxinfo
输出的顶部:
name of display: :0
display: :0 screen: 0
direct rendering: Yes
server glx vendor string: NVIDIA Corporation
server glx version string: 1.4
和我的glewinfo
输出:
GLEW version 1.9.0
Reporting capabilities of display :0, visual 0x2b
Running on a GeForce GTX 560 Ti/PCIe/SSE2 from NVIDIA Corporation
OpenGL version 4.3.0 NVIDIA 310.32 is supported
所以我的问题是:我的代码错了吗?还是我的系统受到了非常微妙的破坏?
编辑
似乎QGLFormat
报告说我只有OpenGL v1.0 - Qt使用什么机制来获得该值?
在我的"真实"应用程序中,我使用QGLFormat::openGLVersionFlags() & QGLFormat::OpenGL_Version_3_3
执行OpenGL版本检查,这通过了;而使用myQGLWidget->format().majorVersion()
和myQGLWidget->format().minorVersion()
分别返回1
和0
。
编辑2
有趣的是,如果我在main.cpp中设置了v3.3的默认QGLFormat
:
QGLFormat format( QGL::DoubleBuffer |
QGL::DepthBuffer |
QGL::AlphaChannel );
format.setVersion( 3, 3 );
QGLFormat::setDefaultFormat( format );
它在我的 OpenGL调用的第一个分段错误,特别是glGenVertexArrays(1, &vao_)
,但myQGLWidget->format().majorVersion()
和myQGLWidget->format().minorVersion()
分别返回3
和3
。
我们最近在工作中使用了这种方法。原因是最新的NVIDIA驱动程序,它打破了主要和次要版本查询。
编辑:我认为这可能与在设置有效的GL上下文之前调用这些函数有关。结束编辑
所以,您可以尝试使用稍微老一点的驱动程序。然而,也有一些Qt版本和glversion的问题。查看此链接:
http://qt-project.org/forums/viewthread/20424- Opengl 3.1 GLSL 140 在 C++ 年输出白色在片段着色器中
- Opengl 4 调试输出不起作用
- OpenGL,纹理输出为纯色
- 如何在OpenGL 3.3中修复黑屏输出
- 简单的openGL画线程序没有输出
- OpenGL:计算着色器 - gl_GlobalInvocationID提供静态输出
- opengl 3.3 中的黑屏输出
- SDL_ttf和OpenGL正在输出看似随机的垃圾和崩溃
- 为什么我的OpenGL引擎中没有从MyGUI获得任何屏幕输出
- 屏幕截图而不是 OpenGL 中的输出
- 文本不会在屏幕C++/OpenGL上输出
- 使用x264将OpenGL输出转换为H264
- 使用 GL_POLYGON 在 OpenGL 中绘制多边形时获得意外输出
- OpenGL 3.30/GLSL 3.30-MRT输出黑色纹理
- 用visual studio和C++/OpenGL进行cout输出
- 使用 OpenGL 对程序输出进行 3D 显示
- 为什么这个openGL代码没有输出任何东西
- 如何在OpenGL中输出变量数
- OpenGL不显示正确的输出时,没有运行在cmd提示符
- 丢失的OpenGL输出