glsl 中的显式或隐式 vec4

Posted

技术标签:

【中文标题】glsl 中的显式或隐式 vec4【英文标题】:explicit or implicit vec4 in glsl 【发布时间】:2016-08-05 12:16:56 【问题描述】:

我发现了一些有趣的东西,我想了解它。

使用 GLSL #version 330

gl_Position 的类型是 vec4

这些行编译得很好:

gl_Position = vec4(0, 0, 0, 0);
gl_Position = vec4(vec3(0, 0, 0), 0);
gl_Position = vec4(vec2(0, 0), vec2(0, 0));
...

不知何故:

gl_Position = (vec2(0, 0), vec2(0, 0));

加注:

error C1035: assignment of incompatible types

编译器能够解析(vec2(0, 0), vec2(0, 0)) 而不会引发语法错误。我想知道这句话是什么意思,我相信它是正确的,并且与vec4有不同的类型。

问题:(vec2(0, 0), vec2(0, 0))GLSL 中是什么意思?

编辑:

编译:

 float x = (0.0, 1.0, 1.0, 2.0, 3.0, 5.0, 8.0);

语法错误:

 float x = 0.0, 1.0, 1.0, 2.0, 3.0, 5.0, 8.0;

【问题讨论】:

【参考方案1】:

您使用comma operator,创建一个vec2,然后创建另一个vec2,最后一个vec2是表达式的结果。

【讨论】:

为什么?这是标准吗?有什么理由允许这样做吗? @DombiSzabolcs comma operator 是所有基于 C 语言的标准运算符,包括 GLSL。它用于对表达式进行排序。 现在我明白发生了什么,但仍然不明白为什么允许这样做。我贴了另一个例子。 @DombiSzabolcs 您的新问题与如何解析和处理初始化有关。尝试做例如float x; x = 0.0, 1.0, 1.0, 2.0, 3.0, 5.0, 8.0; 代替。 @Mars 第 107 页:序列 (,) 运算符通过返回逗号分隔的表达式列表中最右侧表达式的类型和值来操作表达式。所有表达式都按从左到右的顺序进行计算。

以上是关于glsl 中的显式或隐式 vec4的主要内容,如果未能解决你的问题,请参考以下文章

MySQL #1422 存储函数或触发器中不允许显式或隐式提交

如何在 ASP.NET 响应中将 Transfer-Encoding 设置为显式或隐式分块?

依赖注入和显式接口实现

例题 6-21 UVA - 506System Dependencies

GLSL

MySQL数据类型 - 数据类型默认值