gpt4 book ai didi

qt - 使用着色器时在QGLWidget中通过OpenGL使用QPainter

转载 作者:行者123 更新时间:2023-12-04 03:30:49 26 4
gpt4 key购买 nike

你们中的许多Qt(特别是4.6)用户将熟悉OpenGL教程中提供的Overpainting示例,我试图做一些非常相似的事情,但是将着色器用于纯OpenGL数据,而不是旧的固定功能管道。

//  Set background and state.
makeCurrent();
qglClearColor( bgColour_ );

glEnable( GL_DEPTH_TEST );
glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );

if ( smoothLines_ ) {
glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
glEnable( GL_LINE_SMOOTH );
glHint( GL_LINE_SMOOTH_HINT, GL_NICEST );
}

// Clear the buffers.
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glUseProgram( shader_ );

// Draw the grid.
try {
glLineWidth( 2.0f );
manager_->setColour( centreColour_ );
grid_->draw( oE_GLGrid::Centre );

glLineWidth( 1.5f );
manager_->setColour( majorColour_ );
grid_->draw( oE_GLGrid::Major );

glLineWidth( 1.0f );
manager_->setColour( minorColour_ );
grid_->draw( oE_GLGrid::Minor );
} catch( oE_GLException& e ) {
cout << "OpenGL Error: " << e.what() << endl;
return;
}

// Reset OpenGL state for overlays.
glDisable( GL_DEPTH_TEST );
if ( smoothLines_ ) {
glDisable( GL_BLEND );
glDisable( GL_LINE_SMOOTH );
}

// Draw the overlays.
QPainter p( this );
p.beginNativePainting();
p.fillRect( 10, 10, 100, 100,
QColor( 255, 0, 0 ) );
p.endNativePainting();

我正在构建一个3D Assets 应用程序,从而构建了网格内容。为了使其在工作时确实很明显,应该在小部件的左上角出现一个大的红色矩形,但事实并非如此。

3D可以正常工作,但是QPainter不会在屏幕上显示任何内容。我和我的文档之间唯一真正的区别是,所有投影和变换矩阵计算都被其他函数隐藏,然后通过glUniform上传到着色器。大概是因为QPainter将2D Assets 拆分为三角形,这意味着QPainter的着色器无法访问我的投影/变换矩阵,因此我的红色三角形开始绘制-但可能不在屏幕上。

最佳答案

在进行OpenGL调用之前,请调用beginNativePainting()。 OpenGL状态的glPush/Pop也可能是必需的。尝试如下操作:

QPainter p( this );
p.beginNativePainting();

// Maybe necessary
glPushAttrib(GL_ALL_ATTRIB_BITS);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glMatrixMode(GL_MODELVIEW);
glPushMatrix();

// Put OpenGL code here

// Necessary if used glPush-es above
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glPopAttrib();

p.endNativePainting();

p.fillRect( 10, 10, 100, 100,
QColor( 255, 0, 0 ) );

关于qt - 使用着色器时在QGLWidget中通过OpenGL使用QPainter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4316119/

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