OpenGL点精灵(Point Sprite)

From:http://iiunknown.blogbus.com/logs/48250551.html

在很多粒子的demo中,看到把粒子显示成一个个小球,如果你以为那是用glutSolidShpere画出来的话,你就错了。上万个粒子,每个球体的几何,对于绘制系统的压力已经过大了。实际上这里是利用了一种类似billboard的方法,称为点精灵,就是POINT_SPRITE。

 

就像billboard一样,只要保证一个面片始终面向观察者,具体的形状已经不重要了。而点精灵实际上是一个点,绘制的时候也是使用的GL_POINTS。

 

使用方法大致如下:

 

glEnable(GL_POINT_SPRITE_ARB);

glTexEnvi(GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE);

glEnable(GL_VERTEX_PROGRAM_POINT_SIZE_NV);

glDepthMask(GL_TRUE);

glEnable(GL_DEPTH_TEST);

 

glColor3f(1, 1, 1);

_drawPoints(); // 绘制在这里

 

glUseProgram(0);

glDisable(GL_POINT_SPRITE_ARB);

 

另外由于实际上绘制的是POINTS,它并不会根据距离的远近而变化大小,实际造成的结果就是越远看显得越大,就像下图一样。


(此图来自于:http://www.cnblogs.com/atlantis13579/archive/2010/12/09/1901658.html


为了解决这个问题,还要调用

float quadratic[] = { 1.0f, 0.0f, 0.01f };

glPointParameterfvARB( GL_POINT_DISTANCE_ATTENUATION_ARB, quadratic );

glPointParameterfARB( GL_POINT_FADE_THRESHOLD_SIZE_ARB, 60.0f );

glPointParameterfARB( GL_POINT_SIZE_MIN_ARB, 13.0f );

glPointParameterfARB( GL_POINT_SIZE_MAX_ARB, 15.f );

 

让尺寸随着距离进行衰减,具体的使用方法可以按关键字搜索,我也仍旧在摸索中

最后提示一句:做大量粒子绘制的时候一定要使用vbo,可以大大提高绘制效率。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值