统一结构的奇怪行为

问题描述 投票:0回答:1

我正在编写 OpenGL 代码,并注意到从具有匿名结构类型的制服获取统一位置时出现奇怪的行为。 Wiki 说禁止匿名结构,但我实际上能够在顶点着色器中将它们创建为统一类型,没有问题:

uniform struct // no name here! compiled fine!
{
    mat4 device;
    mat4 position;
    mat3 normal;
} uni_transforms;

我还尝试将所有

sampler2D
放入一个统一的结构中,但遇到了一个问题:我无法在存在
sampler2D
的情况下执行匿名结构:着色器编译得很好,但我无法获得
sampler2D
的统一位置(不,统一在着色器代码中使用,因此不会因为未使用而被丢弃):

uniform struct
{
    sampler2D diffuse;
    sampler2D specular;
    sampler2D normal;
} uni_textures;

我尝试在

struct
之后在声明中添加类型名称,现在(显然)制服就在那里,位置找到了。

为什么我能够创建匿名结构,而标准却说我不能?为什么我无法使用

sampler2D
创建它们?

如果实施很重要,我在 Windows 10

Intel UHD Graphics 620
上的
i5-8265U
上运行此代码。

UPD:在

AMD Radeon Graphics
上的
Ryzen 5 5600H
,Windows 10 上,匿名结构也运行良好(没有测试 Sampler2D 的东西)。看来我是这里的罪犯,而不是标准。

opengl glsl
1个回答
0
投票

首先,虽然 wiki 是一个很好的资源,但它不是官方标准。如果您不确定 GLSL 允许什么,您应该阅读 GLSL 规范。

在这种情况下,维基百科包含部分错误的信息。根据GLSL 460规范第4.1.8章,结构体定义如下:

限定符opt 结构名称opt{成员列表}声明符opt;

因此结构名称是可选的,您可以省略它们。不过,规范中还包含这样一句话:

不支持匿名结构。

但是规范给了你一个例子:

struct S { float f; }; // Allowed: S is defined as a structure.
struct T {
  S; // Error: anonymous structures disallowed
  struct { ... }; // Error: embedded structures disallowed
  S s; // Allowed: nested structure with a name.
};

因此,虽然 GLSL 不支持匿名结构,但它们的意思是您无法在结构中定义没有名称的变量。但您可以创建一个没有名称的结构。

维基页面所说的是正确的

GLSL不支持匿名结构

但当它试图解释什么是匿名结构时

没有类型名称的结构

© www.soinside.com 2019 - 2024. All rights reserved.