OpenGL游戏引擎开发[8]-巧用贴图透明度通道显示复杂模型

使用透明度渲染物体

我们游戏中的模型一般都是在3D建模中做的,比如:人物模型、建筑模型等。这些模型直接关系到游戏的效果,所以,美工人员花费很大精力去雕琢模型也无可厚非。

然而,那些环境的装饰的模型,比如:草、杂草、、、 这些模型本来形状就不规则,3D建模比较麻烦,而且只是装饰作用,玩家也不一定把它当回事,所以,没必要画很大精力去雕琢这些模型。

但是,你也不能太磕碜吧,你随意搞个太丑的模型,和场景中其他模型放在一起毫无违和感,那这。。。

其实,我们可以有个取巧的办法。既能基本满足可视化的需求,对模型的要求也不是很高。

那就是巧用贴图的透明通道。

比如,这是在blender中建立的草的模型。这个不复杂把,就是两个矩形叠加在一起。

这是对应的草的贴图,也不复杂吧,只是一张没有背景色(也就是背景色的透明通道为0)图片。

如果我们直接加载,那就会是这样:

因为,我们给模型贴图时,采样到背景色时,背景没有颜色,那么像素值就为0,当然显示黑色的了。

使用假光照

那么我们把采样到背景色的片元丢弃掉不就可以了?也就是说,这些片元经过片段着色器(采样是在片段着色器中进行的)之后,就被丢弃了,就不参与接下来的渲染流水线了。

方法很简单,我们在片段着色器中,判断一下采样到的颜色的alpha值

这里给了一个0.5作为阈值,也就是透明度小于0.5像素我们都认为是背景色。

那么显示的效果是这样的:

是不是有点那个意思了。

但是,你发现没有,有的草是正常显示的,有的草的一部分显示为黑色。

因为场景中有光啊,光照不到的地方当然是黑色的。

但是,你看草模型参与光照计算的话,是多么的丑。所以,我们其实不希望草受到光照的影响的。

所以,安排。。。

大家都知道,光照的效果很大程度上取绝于物体顶点法线的位置,如果我们把草顶点的法线都设置为(0,1,0)也就是始终朝上(右手坐标系),那么效果怎么样呢?

实现方法很简单,光照计算是在片段着色器中计算的,但是顶点数据是从顶点着色器传递过去的,比如:顶点的法线。

所以,我们在顶点着色器中规定,凡是标记了使用 假光照 的模型,我们将其顶点的法线设置为(0,1,0)

这个 useFakelight 其实就是一个布尔类型的变量,用来声明模型是否使用 假光照,其定义如下:

加载草模型的时候,设置相应的值,表示要特殊处理。

需要说明的是,glsl是没有布尔类型的,所以在glsl中声明 useFakelight 为 float,我们在Java中传递true(其实就是1)肯定是大于glsl中设置的0.5的。(奇技淫巧)

然后,最终效果为:

禁用背面裁剪

有时候我们为了性能考虑,是开启背面裁剪的,也就是说,我们看不到的面是不渲染的。但是对于这里草这样的模型,有点特殊,需要在渲染的时候关闭背面裁剪。如果不关,那么是这样的:

发现没有,转动一下场景,草的另一半不显示了。因为这里草这个模型有点特殊,两个矩形叠加在一起,矩形顶点的法线肯定不会都朝着一个方向。所以,这里我们在渲染草模型的时候,关闭背面裁剪,让正面和背面都显示就可以了。

最终结果:

完活儿。

欢迎大家关注我的公众号【OpenGL编程】。

每天进步一点点,探索3D编程背后的技术细节,不再做只会“调包”的傻小白。以幽默风趣的行文风格,近乎白话文的专业知识讲解,分享3D编程的心得、教程、算法,带你走进3D编程的世界。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值