我正在制作一个使用点精灵的小型OpenGL Mac应用程序。我使用一个顶点数组来绘制它们,并且我想使用一个类似的“数组”函数来为它们提供所有不同的大小。如何在OpenGL中绘制不同大小的点精灵?
在OpenGL ES中,有一个名为GL_POINT_SIZE_ARRAY_OES的客户端状态和一个对应的函数glPointSizePointerOES(),它们完全符合我的要求,但似乎无法在标准OpenGL中找到等价物。
OpenGL是否以任何方式支持它?
我正在制作一个使用点精灵的小型OpenGL Mac应用程序。我使用一个顶点数组来绘制它们,并且我想使用一个类似的“数组”函数来为它们提供所有不同的大小。如何在OpenGL中绘制不同大小的点精灵?
在OpenGL ES中,有一个名为GL_POINT_SIZE_ARRAY_OES的客户端状态和一个对应的函数glPointSizePointerOES(),它们完全符合我的要求,但似乎无法在标准OpenGL中找到等价物。
OpenGL是否以任何方式支持它?
为了扩大一点上奋的回答,正是你想要的固定功能的OpenGL管道不能做。它可以做'透视'点,随着Z距离的增加而变小,但仅此而已。
对于每个顶点的任意点大小,您需要一个自定义顶点着色器来设置每个顶点的大小。将点的大小作为属性数组传递(重新使用曲面法线或tex坐标,或使用自己的属性索引)或在纹理贴图中传递,例如宽度等于点数组大小的一维纹理。 Fen引用的着色器代码示例使用纹理贴图技术。
的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
嗨,感谢您的回复!点参数路由似乎可能是我试图完成的脏修复(这是关于实际大小,而不是透视图)。我想我必须开始阅读着色器。无论如何,这是关于时间的。 –
固定管道是旧的方式......但将工作。如果你有更多的时间,我建议实现它的着色方式 – fen
如果通过“OpenGL支持这个”,你的意思是“我可以在OpenGL中做那样的事情”,绝对是。
使用着色器。传递一个代表点大小的1维通用顶点属性。在顶点着色器中,将该点大小设置为顶点着色器的输出gl_PointSize
。这真的很简单。
如果你的意思是“固定功能的OpenGL支持这个”,否。
感谢您的提示!我以前从未使用过着色器,只有对它们有基本的了解,所以这似乎是一个很好的机会让我的脚湿润。 –