OpenGL:渲染可变大小的精灵

时间:2014-02-04 15:44:02

标签: opengl directx sprite

我有一个粒子系统来模拟沙流模拟。我遇到了CUDA SDK 粒子示例,我将其修改为处理不同大小的粒子。每个粒子的位置和颜色存储在VBO中,我为radius属性添加了一个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种解决方案的可行性: -

  1. 使用glusphere(),然后翻译和缩放。但是我担心这可能会因为必须渲染所有这些额外的顶点而受到性能影响。

  2. Ditch OpenGL并将整个东西移植到Direct3D 9,我认为它有一个内置属性接受变量精灵半径,但是有一个时间限制,我对DirectX一无所知。

  3. 我可以在同一场景中实现上述顶点着色器的2个实例,并将它们传递给不同的pointRadius吗?

1 个答案:

答案 0 :(得分:1)

  

我广泛搜索,但发现没有办法让精灵从粒子半径VBO获取可变半径。

  1. glEnable(GL_PROGRAM_POINT_SIZE)
  2. 添加varying float pointSize并将您的半径VBO绑定在那里
  3. 您的顶点着色器中的
  4. gl_PointSize = pointSize