OpenGL-3D图形渲染注意点

问题

用GLTools中的自带函数gltMakeTorus绘制一个红色的甜甜圈,然后用点光源着色器进行渲染渲染。当让甜甜圈进行旋转后就会出现有黑色块状的问题,如下图:

在这里插入图片描述
在这里插入图片描述

出现这种问题的原因是,甜甜圈是一个立体图形,有正面和背面。我们用点光源着色器,正常情况下,正面被渲染成红色,背面为黑色。在甜甜圈旋转的过程中,正面依次变成了背面,而背面依次变成了正面,正背面交织在一起,就出现了有红色有黑色的情况。

解决方案1:油画算法

在绘制物体时,先绘制离观察者较远的部分,再绘制较近的部分,这种绘制方式叫做油画算法。通过油画算法可以有效解决正背面交织显示的问题。

在这里插入图片描述

但是油画算法存在弊端:

  1. 耗费性能:由于是由远至近的绘制,导致所有景物都必须绘制一遍,而远处物体被近处物体所遮挡住的部分,其实是不需要绘制的。比如上图中山体被数目遮挡的部分,要先绘制成山体,再绘制成树木,就是一种性能浪费。
  2. 无法绘制:多个物体在z轴上相互交错时,无法确定先后绘制顺序,如下图

在这里插入图片描述

解决方案2:正背面剔除

一个3D物体,我们从任何一个方向去观察,都是只能看到它的一部分表面。对于看不到的表面,其实是没有必要进行绘制的。这种只绘制看得到的部分而剔除掉看不到的部分的绘制方式叫做正背面剔除。

在OpenGL中,所绘制的图形是通过一个个的三角形组合成的。OpenGL通过分析顶点数据的顺序得知哪些面是正面、哪些面是背面。默认规则:

  • 正面:按照逆时针顶点连接顺序的三角形面。
  • 背面:按照顺时针顶点连接书序的三角形面。

在这里插入图片描述

在这里插入图片描述

上图中,左侧三角形顶点顺序为1->2->3,右侧三角形顶点顺序为1->2->3。

  • 当观察者在右侧时:坐侧三角形为顺时针方向,判定为背面;右侧三角形为逆时针方向,判定为正面。
  • 当观察者在左侧时:左侧三角形为逆时针方向,判定为正面;右侧三角形为顺时针方向,判定为背面。
  • 总结:正面和背面是由三角形的顶点顺序和观察者方向共同决定的,随着观察者的角度变化,正背面也会跟着改变,这也与现实中的情况相吻合。
		//开启正背面剔除
    glEnable(GL_CULL_FACE);
    //关闭正背面剔除
    glDisable(GL_CULL_FACE);
    /*
    选择剔除哪个面(默认背面剔除)
    GL_
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值