【发布时间】:2014-02-05 00:38:34
【问题描述】:
我有一个粒子系统来模拟沙流模拟。我遇到了 CUDA SDK particles 示例,我对其进行了修改以处理不同大小的粒子。每个粒子的位置和颜色存储在 VBO 中,我为半径属性添加了一个 VBO。物理方面很好。在渲染中,我的问题是:-
该示例实现了一个使用 GL_POINT_SPRITE_ARB(它是 NVidia 扩展)的顶点着色器,它采用固定的粒子半径。我用谷歌搜索了很多,但没有找到让精灵从粒子半径 VBO 中获取可变半径的方法。
顶点着色器如下所示:
#define STRINGIFY(A) #A
// vertex shader
const char *vertexShader = STRINGIFY(
uniform float pointRadius; // point size in world space
uniform float pointScale; // scale to calculate size in pixels
uniform float densityScale;
uniform float densityOffset;
void main()
{
// calculate window-space point size
vec3 posEye = vec3(gl_ModelViewMatrix * vec4(gl_Vertex.xyz, 1.0));
float dist = length(posEye);
gl_PointSize = pointRadius * (pointScale / dist);
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_Position = gl_ModelViewProjectionMatrix * vec4(gl_Vertex.xyz, 1.0);
gl_FrontColor = gl_Color;
}
);
如何获得不同大小的点精灵来渲染?
注意:- 这是一个工作站应用程序,因此不能使用 OpenGL ES。
我还想问一下我提出的 2 个解决方案的可行性:-
使用 glusphere(),然后是平移和缩放。但我担心这可能会影响性能,因为必须渲染所有这些额外的顶点。
抛弃 OpenGL 并将整个东西移植到 Direct3D 9,我相信它有一个接受可变精灵半径的内置属性,但是有时间限制,我对 DirectX 一无所知。
我可以在同一个场景中实现上述顶点着色器的 2 个实例并传递不同的 pointRadius 吗?
【问题讨论】:
-
点精灵自 GL 2.0 以来一直是核心。
-
...
GL_POINT_SPRITE_ARB (its an NVidia extension )。不,不是,ARB表示架构审查委员会。任何附加到末尾的内容都是已获得 ARB 批准的标准扩展,其中包括 NV、AMD、英特尔、Apple ……以及曾经的 Microsoft。如果它是 NV 扩展,它将被称为GL_POINT_SPRITE_NV。 -
@AndonM.Coleman 是对的。它不是,但是我在使用 NV 扩展的绘图函数中遗漏了一些代码。原来是导致问题的原因