【问题标题】:OpenGL: Rendering sprites of variable sizesOpenGL:渲染可变大小的精灵
【发布时间】: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 个解决方案的可行性:-

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

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

  3. 我可以在同一个场景中实现上述顶点着色器的 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 扩展的绘图函数中遗漏了一些代码。原来是导致问题的原因

标签: opengl directx sprite


【解决方案1】:

我在 Google 上进行了广泛搜索,但没有找到让精灵从粒子半径 VBO 中获取可变半径的方法。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多