OpenGL ES着色器语言规范 10 常见问题(30-33)
目录
10.30 运算符精度
是否应该定义add和multiply等操作的精度?
这些不是由C ++标准定义的,但通常假设C ++实现将使用IEEE 754算法。对于通常仅支持IEEE 754的子集的GPU而言,情况并非如此。此外,诸如超越函数的许多操作被认为太昂贵而不能以超过10个有效精度位实现。除法通常通过倒数和乘法来实现。在整数除法的情况下,这可能导致非明显的错误。例如:
9/3 = 9.0 *(1.0 / 3.0)= 9.0 * 0.333 = 2.997 = 2(整数)
A:鉴于当前实施的范围很广,标准化这些精度是不可行的。 因此,操作的精确性取决于实现。
10.31 编译器转换
应该允许哪些编译器转换?
C ++禁止编译器转换表达式来改变最终结果。 (请注意,C ++允许使用比指定更高的精度,但这是一个不同的问题。)GPU通常使用此类.例如,在将顺序代码映射到基于矢量的体系结构时进行转换。
A:允许一组指定的转换(除了C ++允许的转换)
10.32 在预处理器中扩展类函数宏
扩展宏时,每个宏只能应用于原始token或从该token生成的任何token。 为了实现这一点,类功能宏的扩展需要为每个token保留一个应用宏列表。这是一个很大的开销。
A:遵循C ++规范。
如果在扩展类函数宏期间遇到指令,那么行为应该是什么?
虽然有几个编译器实现了预期的行为,但目前在C ++中将其指定为未定义。
A:当做是未定义的行为。
10.33 扩展宏是否应在全局范围内定义?
对于每个扩展,都有一个关联的宏,着色器可以使用它来确定扩展是否可用于给定的实现。 该宏是全局定义还是应该在(成功)启用扩展时定义?
这两种选择都是可用的,因为尝试启用未实现的扩展只会导致警告。
选项1:全局定义
#ifdef GL_OES_standard_derivatives
#extension GL_OES_standard_derivatives : enable
...
#endif
选项2:定义为#extension的一部分
#extension GL_OES_standard_derivatives : enable // warning if not available
#ifdef GL_OES_standard_derivatives
...
#endif
A:宏是全局定义的。
版权:https://blog.****.net/flycatdeng/article/details/88771873