如何在OpenGL中绘制不同大小的点精灵?

时间:2013-03-30 07:30:37

标签: macos opengl

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

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

OpenGL是否以任何方式支持这一点?

3 个答案:

答案 0 :(得分:2)

OpenGL不支持此Apple扩展程序,但您可以通过其他方式执行此操作:

对于固定管道:( 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

答案 1 :(得分:2)

为了扩展Fen的答案,固定功能OpenGL管道无法完全按照您的要求进行操作。它可以做“透视”点,随着Z距离的增加而变小,但就是这样。

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

答案 2 :(得分:1)

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

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

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