【问题标题】:Get the size of compiled glsl shader uniform parameter from C++ code从 C++ 代码中获取编译后的 glsl 着色器统一参数的大小
【发布时间】:2017-04-12 09:21:51
【问题描述】:

我正在尝试在已编译的 glsl 着色器程序中获取统一参数的大小。我发现了一些函数可以只为默认类型的制服做这件事。但是有没有办法为自定义类型的统一参数做到这一点?

例如:

struct Sphere
{
    vec3 position;
    float raduis;
};

#define SPHERES 10
uniform Sphere spheres[SPHERES];

【问题讨论】:

    标签: c++ opengl glsl


    【解决方案1】:

    我假设你的最终目标基本上是spheres.length,结果是10

    最好的方法是将该长度存储在其他地方,因为无论如何编译着色器后都无法更改大小。


    没有简单的方法来获取数组的长度。因为本身没有任何数组。当编译数组的每个元素(以及结构的每个元素)最终成为他们自己的个人制服。这样做的需要很明显:

    glGetUniformLocation(program, "spheres[4].position")
    

    问题是,如果您的着色器只使用spheres[4].positionspheres[8].position,那么所有其他spheres[x].position 都可能被优化掉,因此不存在。


    那么如何得到统一的数组长度呢?

    您可以通过使用glGetActiveUniform() 和正则表达式或sscanf() 来完成此操作。假设您想检查有多少 spheres[x].position 可用,那么您可以这样做:

    GLint count;
    glGetProgramiv(program, GL_ACTIVE_UNIFORMS, &count);
    
    const GLsizei NAME_MAX_LENGTH = 64
    
    GLint location, size;
    GLenum type;
    GLchar name[NAME_MAX_LENGTH];
    GLsizei nameLength;
    
    int index, charsRead;
    
    for (GLint i = 0; i < count; ++i)
    {
        glGetActiveUniform(program, (GLuint)i, NAME_MAX_LENGTH, &nameLength, &size, &type, name);
    
        if (sscanf(name, "spheres[%d].position%n", &index, &charsRead) && (charsRead == nameLength))
        {
            // Now we know spheres[index].position is available
        }
    }
    

    您还可以将typeGL_FLOATGL_FLOAT_VEC3 进行比较,以确定它是哪种数据类型。

    请记住,如果您添加 int count 并为每次匹配增加它。那么即使count最后是3。这并不意味着它是可用的元素0, 1, 2。它很容易成为元素0, 5, 8

    补充说明:

    • name 是一个以空字符结尾的字符串
    • %n 是目前读取的字符数

    【讨论】:

    • 感谢您的大解释,但我的问题是,如果统一变量具有用户定义的类型,如何通过其名称获取其大小。抱歉,我在那里添加了数组以显示最困难的情况,但我想这让我的问题不清楚。所以,这里是更简单的统一声明:uniform Sphere spheres; 我想从我的 C++ 代码中获取“球体”变量的大小。
    • 我的回答已经涵盖了?使用type。问题是没有sizeof(sphere[i]),因为本身没有sphere[i]。只有每个映射到统一的单个元素。所以你必须检查每个sphere[i].*。然后检查它们的类型,然后您可以得出最终尺寸。因此,如果要检查数组的最终大小,则必须检查每个 sphere.*
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多