gpt4 book ai didi

opengl - OpenGL统一缓冲区std140布局,驱动程序错误或我误解了规范?

转载 作者:行者123 更新时间:2023-12-04 13:43:18 26 4
gpt4 key购买 nike

OpenGL规范存在(或这是一个错误?)...引用带有共享统一缓冲区的std140的布局,它指出:

"The set of rules shown in Tabl e L-1 are used by the GLSL compiler to layout members in a std140-qualified uniform block. The offsets of members in the block are accumulated based on the sizes of the previous members in the block (those declared before the variable in question), and the starting offset. The starting offset of the first member is always zero.

Scalar variable type (bool, int, uint, float) - Size of the scalar in basic machine types"



( http://www.opengl-redbook.com/appendices/AppL.pdf)

因此,有了这些信息,我在着色器中设置了一个统一的块,看起来像这样:
// Spotlight.

layout (std140) uniform Spotlight
{
float Light_Intensity;
vec4 Light_Ambient;
vec3 Light_Position;
};

...只是发现它不适用于我在CPU端设置的后续std140布局。也就是说,前4个字节是浮点数(GLfloat的机器标量类型的大小),后16个字节是vec4,随后的12个字节是vec3(最后留有4个字节以考虑该规则vec3确实是vec4)。

当我更改CPU端以将浮点数指定为与vec4相同的大小(即16个字节),并按此假设进行偏移量和缓冲区大小时,着色器将按预期工作。

因此,在这种情况下规范要么是错误的,要么是我误解了“标量”的含义,或者是ATI出现了驱动程序错误。任何人都可以阐明这个谜题吗?

最佳答案

您链接到的PDF是而不是 OpenGL specification。我不知道你从哪里得到的,但这当然不是完整的规则 list 。经常检查您的资源;规范并不像许多人所声称的那样难以理解。

是的,基本类型的变量的大小与基 native 器类型的大小相同(即:4个字节)。但是,大小本身并不能确定变量的位置。

每种类型都有一个基本对齐方式,无论该类型在统一块中的什么位置,其总字节偏移量都必须适合该对齐方式。 vec4的基本对齐方式是4 *基本类型的对齐方式(即:float)。因此vec4的基本对齐方式是16。

因为Light_Intensity在4个字节后结束,所以编译器必须插入12个字节的填充,因为Light_Ambient不能在4个字节的边界上。它必须在16字节边界上,因此编译器使用12字节的空白空间。

ATI确实在std140布局周围存在一些驱动程序错误,但这不是其中之一。

通常,我喜欢将填充明确地放入结构中,并且避免使用vec3(因为它具有16个字节的对齐方式)。这样做通常可以减少编译器错误,也可以避免意外误解事情的去向和实际占用的空间。

关于opengl - OpenGL统一缓冲区std140布局,驱动程序错误或我误解了规范?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7451476/

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