【发布时间】:2021-12-29 16:17:57
【问题描述】:
我有一个带有结构数组的基本 GLSL 片段着色器。我希望能够根据运行我的程序的机器来确定数组的大小。
#version 410
#define MAX_DATA_SIZE %1
//32B (x8 FLOATS)
struct Data
{
uint uintValue;//4B: 0
float floatValue;//4B: 4
sampler2D sampler;//16B: 5-8
};
uniform Data dataArray[MAX_DATA_SIZE];
想法是:
- 读取 GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 的值
- 将该值除以我的结构体大小(即 8),以获得数组的最大大小
- 在 QT 中将着色器作为 QString 读取,并将 %1 替换为计算出的最大大小
我的 NVIDIA GPU 运行正常。
问题出在我的英特尔集成 GPU 上。当我根据我的英特尔集成 GPU 告诉我的内容更新数组大小时(GL_MAX_FRAGMENT_UNIFORM_COMPONENTS 返回 4096/8 = 512),应用程序崩溃,似乎没有内存来分配给数组。
由于某种原因,实际的最大数组大小似乎是 32,而我的英特尔 GPU 对我撒谎。我在这里有什么遗漏或做错了吗?
我知道 UBO 会是更好的选择,但我正在处理不久前编写的代码,并且转换它需要时间。因此,我正在寻找您所说的“HOT FIX”。
【问题讨论】:
-
"我的结构的大小是 8" 这不是组件计数的工作方式。根据标准和 ARB_bindless_texture,您的结构的组件数为 4。
标签: c++ qt opengl glsl fragment-shader