gpt4 book ai didi

c++ - 如何高效动态地将多个 uniform 传递给 GLSL

转载 作者:可可西里 更新时间:2023-11-01 17:59:11 25 4
gpt4 key购买 nike

我想在我的程序中传递一个结构数组,我知道有几种方法可以做到这一点,但我想高效地做到这一点,这是我知道我可以做的:

  • 我可以简单地使用我想传递给着色器的东西创建一个结构,并创建一个可以传递多少的数组:

    struct Light
    {
    vec3 Position;
    vec3 diffuse;
    float Intensity;
    };

    #define NUM_OF_LIGHTS 5
    uniform Light lights[NUM_OF_LIGHTS];

    优点:非常容易做到。

    缺点:它不是动态的,我需要选择最大数量的灯,我想避免这样做。

  • 我可以使用我在 opengl.org 上读到的统一 block 对象 (UBO)我可以从 OpenGL 4.0 为它们使用数组(顺便说一下,这是我的目标,(考虑 4.1))。

    优点: 更清洁(?)。可能会更快(?)1

    缺点:仍然不是动态的。

  • 着色器存储 block 对象 (SSBO) 是另一种选择,但我不能使用它们,因为它们是 4.3 版的核心。对我不利,因为据我所知,它们是动态的,而这正是我想要的。

我找不到任何其他关于如何按我想做的事情传递的信息。

如果我做不到,游戏引擎如何在不知道用户将进入多少灯光的情况下创建多个灯光(考虑到他们使用 OpenGL 并且他们的目标是 3.X 到 4.0,这对我来说似乎是合理的)?

提前致谢。

脚注:

  1. 我在这里可能是错的,所以如果让我知道,我会删除那些。

最佳答案

你的第一个解决方案稍微修改一下怎么样:

struct Light
{
vec3 Position;
vec3 diffuse;
float Intensity;
};

#define MAX_NUM_OF_LIGHTS 50 //define max number of lights
uniform Light lights[MAX_NUM_OF_LIGHTS];
uniform int number_of_lights //the actual number of lights, for loops

仍然不是您想要的,但效果很好。

关于c++ - 如何高效动态地将多个 uniform 传递给 GLSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43114707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com