opengl中点精灵的使用

    本人的个人博客首页为: http://www.ourd3js.com/

    csdn博客首页为:http://blog.csdn.net/lzhlzz/

    转载请注明出处,谢谢。


    现在假设在一个OpenGL的场景中存在大量的点,在绘制中你可以使用glVertex3d函数,绘制出来后,如果点很小,你看到了是场景中大量的“点”,如果用glPointSize使点变大,你看到的是场景中有大量的“方格”。是的,OpenGL中的点,其实都是方格,只是如果尺寸太小,看上去就像是点了。

    既然是方格,如果我现在就是希望点的尺寸很大,又使得大量的点都是圆形,怎么办呢?可以进行纹理贴图。做一个png格式的图片,中部是圆球,旁边不需要的部分设置为透明,贴到各个点上就行了。

    可是问题就来了,图片是一个“矩形”,怎么贴到“点”呢(虽然这个点显示出来是矩形,但实际上你只有一个坐标,在数学上它是点)?这就要用到点精灵(Point Sprite)了。

    这里主要参考自:http://marina.sys.wakayama-u.ac.jp/~tokoi/?date=20060227

    首先确保使用OpenGL 3.0以上,下载GLEW使用。下载地址及相关配置方法详见:http://glew.sourceforge.net/。

    在OpenGL中,读取纹理,然后在后面加上一条语句 。

glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE);

    在OpenGL的初始化函数中添加。

glAlphaFunc(GL_GREATER, 0.3);

    表示只有当不透明度大于0.3的像素才使用。

    alpha值,即不透明度,opengl中被规划到0到1中,值越大,就越不透明。当alpha值为1.0时是完全不透明的,即完全可见。

    接下来在绘制中,代码为:

glEnable(GL_TEXTURE_2D);
glEnable(GL_POINT_SPRITE);
glEnable(GL_ALPHA_TEST);
glPointSize(15.0f);
glBegin(GL_POINTS);
for(int i=0;i

    粒子通常是圆形,而贴图是方形,所以需要用RGBA格式,而不用RGB格式,即有alpha通道的格式。

    这里主要参考  http://wiki.livedoor.jp/mikk_ni3_92/d/png%b7%c1%bc%b0%a4%ce%b2%e8%c1%fc

    使用 glpng 来加载png格式图片的纹理

pngInfo info;


glGenTextures(1, &texture[0]);
glBindTexture(GL_TEXTURE_2D, texture[0]);


texture[0] = pngBind("ball.png", PNG_NOMIPMAP, PNG_ALPHA, &info, GL_CLAMP, GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR);


if( texture[0] == 0 )
{
return FALSE;
}


/* 等同于
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
pngLoad("ball.png", PNG_NOMIPMAP, PNG_ALPHA, &info);
*/


你可能感兴趣的:(OpenGL,opengl,3d,点精灵,纹理)