Qt 使用QPaint时,对象是透明的

Qt 使用QPaint时,对象是透明的,qt,opengl,qpainter,qopenglwidget,Qt,Opengl,Qpainter,Qopenglwidget,所以我试着在我的物体上贴标签。我尝试了一个测试示例,只是在那里放了一个简单的标签。然而,当我运行程序时,所有的对象都是透明的 油漆: void mainWidget::paintGL(){ 油漆工(本); 画家。开始绘画(); glClearColor(0.0f、0.0f、0.0f、1.0f); glViewport(0,0,width(),height()); 投影=摄影机->获取投影矩阵(60.0f,宽度(),高度(),0.1f,100.0f); vec3 cameraPos(摄像头->获取

所以我试着在我的物体上贴标签。我尝试了一个测试示例,只是在那里放了一个简单的标签。然而,当我运行程序时,所有的对象都是透明的

油漆:

void mainWidget::paintGL(){
油漆工(本);
画家。开始绘画();
glClearColor(0.0f、0.0f、0.0f、1.0f);
glViewport(0,0,width(),height());
投影=摄影机->获取投影矩阵(60.0f,宽度(),高度(),0.1f,100.0f);
vec3 cameraPos(摄像头->获取位置());
视图=摄像机->获取视图矩阵();
glClear(GL_深度_缓冲_位| GL_颜色_缓冲_位);
如果(岛线)
glPolygonMode(GLU前、后、GLU线);
着色器程序->绑定();
着色器程序->设置UniformValue(“灯光.环境光”,0.1f);
shaderProgram->setUniformValue(“Light.position”,QVector3D(ld[0],ld[1],ld[2]);
型号=mat4(1.0f);
model=glm::translate(model,modelOrigin+cubePosModel);
setRotModel(cubeRotModel);
SetMatrix(着色器程序,真);
shaderProgram->setUniformValue(“视图位置”,QVector3D(cameraPos[0],cameraPos[1],cameraPos[2]);
if(showCube)
立方体网格->渲染(着色器程序);
着色器程序->释放();
glPolygonMode(GLU前、后、GLU填充);
如果(岛线)
glPolygonMode(GLU前、后、GLU线);
视图=摄像机->获取视图矩阵();
型号=mat4(1.0f);
model=glm::translate(model,modelOrigin+planePosModel);
setRotModel(planeRotModel);
着色器程序->绑定();
SetMatrix(着色器程序,真);
shaderProgram->setUniformValue(“视图位置”,QVector3D(cameraPos[0],cameraPos[1],cameraPos[2]);
如果(显示平面)
planeMesh->渲染(着色器程序);
着色器程序->释放();
glPolygonMode(GLU前、后、GLU填充);
如果(岛线)
glPolygonMode(GLU前、后、GLU线);
型号=glm::mat4(1.0f);
model=glm::translate(model,modelOrigin+teapotPosModel);
setRotModel(teapotRotModel);
着色器程序->绑定();
SetMatrix(着色器程序,真);
如果(展示茶壶)
茶壶网格->渲染(着色器程序);
着色器程序->释放();
glPolygonMode(GLU前、后、GLU填充);
型号=glm::mat4(1.0f);
model=glm::translate(model,modelOrigin+cubeLightPosModel);
模型=glm::scale(模型,glm::vec3(0.3f));
setRotModel(cubeLightRotModel);
LightCube程序->绑定();
集合矩阵(lightCubeProgram,false);
如果(showCubeLight)
立方体网格->渲染(lightCubeProgram);
LightCube程序->释放();
glPolygonMode(GLU前、后、GLU线);
轴_vao->bind();
型号=mat4(1.0f);
model=glm::translate(model,modelOrigin);
模型=glm::比例(模型,vec3(5.0f));
模型=glm::旋转(模型,glm::弧度(2.0f),vec3(1,1,0));
drawAxisProgram->bind();
glm::mat4 pvm=投影*视图*模型;
drawAxisProgram->setUniformValue(“MVP矩阵”,QMatrix4x4(glm::value_ptr(pvm)).transposed());
如果(显示网格)
gldrawArray(GL_线,0,axisSize);
轴_vao->释放();
drawAxisProgram->release();
glPolygonMode(GLU前、后、GLU填充);
如果(岛线)
glPolygonMode(GLU前、后、GLU线);
型号=mat4(1.0f);
model=glm::translate(model,modelOrigin+vec3(0,2,-1));
着色器程序->绑定();
SetMatrix(着色器程序,真);
if(showSphere)
sphereMesh->render(着色器程序);
着色器程序->释放();
glPolygonMode(GLU前、后、GLU填充);
画家。结束绘画();
画师:设置笔(Qt::黄色);
画家:setFont(QFont(“Helvetica”,8));
painter.setRenderInts(QPainter::抗锯齿| QPainter::文本抗锯齿);
painter.drawText(200400,“场景生成器”);/z=point4.z+distOverOp/4
结束();
}
我不知道为什么,但它是唯一透明的物体。此外,QPainter的添加还将茶壶盖弄乱了。也许这与glPolygonMode混乱的事情有关

如果是QPainter偷偷禁用了
GL_DEPTH_TEST
,似乎是这样,我后来重新启用了它,但它仍然不起作用

mainWidget
是一个
QOpenGLWidget

那么,问题是什么? 图片:

(如您所见,网格线通过茶壶显示,但立方体没有显示,因此它不是完全透明的。)


编辑:我发现所有其他对象也是透明的。

您的深度测试被禁用,或者您的上下文没有深度缓冲区。首先,请确保在初始化期间使用深度缓冲区设置像素格式。有这样一个例子:

QOpenGLWidget *widget = new QOpenGLWidget(parent);
QSurfaceFormat format;
format.setDepthBufferSize(24); // <--- this is what you need
format.setStencilBufferSize(8);
format.setVersion(3, 2);
format.setProfile(QSurfaceFormat::CoreProfile);
widget->setFormat(format); // must be called before the widget or its parent window gets shown

本机绘图代码还是QPainter代码?@zixuan:嗯?第一个代码段应该放在构造函数中的某个地方。例如,
glEnable
可以放在
paintGL
后面的
glClearColor
中。
glEnable(GL_DEPTH_TEST);