OpenGL ES着色器语言规范 10 常见问题(30-33)

目录

10.30 运算符精度

10.31 编译器转换

10.32 在预处理器中扩展类函数宏

10.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.csdn.net/flycatdeng/article/details/88771873

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值