2013-03-30 66 views
2

我正在制作一个使用点精灵的小型OpenGL Mac应用程序。我使用一个顶点数组来绘制它们,并且我想使用一个类似的“数组”函数来为它们提供所有不同的大小。如何在OpenGL中绘制不同大小的点精灵?

在OpenGL ES中,有一个名为GL_POINT_SIZE_ARRAY_OES的客户端状态和一个对应的函数glPointSizePointerOES(),它们完全符合我的要求,但似乎无法在标准OpenGL中找到等价物。

OpenGL是否以任何方式支持它?

回答

2

为了扩大一点上奋的回答,正是你想要的固定功能的OpenGL管道不能做。它可以做'透视'点,随着Z距离的增加而变小,但仅此而已。

对于每个顶点的任意点大小,您需要一个自定义顶点着色器来设置每个顶点的大小。将点的大小作为属性数组传递(重新使用曲面法线或tex坐标,或使用自己的属性索引)或在纹理贴图中传递,例如宽度等于点数组大小的一维纹理。 Fen引用的着色器代码示例使用纹理贴图技术。

+0

感谢您的提示!我以前从未使用过着色器,只有对它们有基本的了解,所以这似乎是一个很好的机会让我的脚湿润。 –

2

的OpenGL不支持此苹果扩展,但你可以做到这一点以外的其他方式:

对于固定管道:(的OpenGL 1.4及以上)

您需要设置点参数:

float attenuation[3] = {0.0f, 1.0f, 0.0f};  
glPointParameterfvEXT(GL_POINT_DISTANCE_ATTENUATION, attenuation); 

glPointParameterfEXT(GL_POINT_SIZE_MIN, 1.0f); 
glPointParameterfEXT(GL_POINT_SIZE_MAX, 128.0f); 

glEnable(GL_POINT_SPRITE); 

的OpenGL将计算点大小为你这样

个着色器

下面是渲染着色器使用一些信息: http://en.wikibooks.org/wiki/OpenGL_Programming/Scientific_OpenGL_Tutorial_01

+0

嗨,感谢您的回复!点参数路由似乎可能是我试图完成的脏修复(这是关于实际大小,而不是透视图)。我想我必须开始阅读着色器。无论如何,这是关于时间的。 –

+0

固定管道是旧的方式......但将工作。如果你有更多的时间,我建议实现它的着色方式 – fen

1

如果通过“OpenGL支持这个”,你的意思是“我可以在OpenGL中做那样的事情”,绝对是。

使用着色器。传递一个代表点大小的1维通用顶点属性。在顶点着色器中,将该点大小设置为顶点着色器的输出gl_PointSize。这真的很简单。

如果你的意思是“固定功能的OpenGL支持这个”,否。