gpt4 book ai didi

c++ - 丢失 OpenGL 输出

转载 作者:太空宇宙 更新时间:2023-11-04 11:57:14 25 4
gpt4 key购买 nike

一周前我将我的操作系统升级到最新版本,所以 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 中设置默认的 QGLFormat v3.3:

QGLFormat format( QGL::DoubleBuffer |
QGL::DepthBuffer |
QGL::AlphaChannel );
format.setVersion( 3, 3 );
QGLFormat::setDefaultFormat( format );

它在第一个 my OpenGL 调用时出现段错误,特别是 glGenVertexArrays(1, &vao_),但是 myQGLWidget->format().majorVersion()myQGLWidget->format().minorVersion() 分别返回 33

最佳答案

我们最近在工作中遇到了这个问题。原因是最新的 NVIDIA 驱动程序打破了主要和次要版本查询。

编辑:我认为这可能与在设置有效的 GL 上下文之前调用这些函数有关。结束编辑

因此,您可以尝试使用稍旧的驱动程序。但是,某些 Qt 版本和 glversion 也存在问题。检查此链接:

http://qt-project.org/forums/viewthread/20424

关于c++ - 丢失 OpenGL 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15711781/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com