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

目录

10.25 动态索引

10.26 纹理单元的最大数量

10.27 目标错误报告

10.28 整数出发的舍入

10.29 未定义的返回值


10.25 动态索引

某些实现不直接支持数组,向量和矩阵的动态索引。

程序转换时是可以的,但性能会降低。

是否应该从规范中删除数组的动态索引?

A:保持统一变量的动态索引(用于蒙皮)。 删除临时(在限制部分)。

 

是否应从规范中删除向量和矩阵的动态索引?

A:保留在主要规范中。 支持不是强制性的。

 

10.26 纹理单元的最大数量

片段着色器中必须支持的最小纹理单元数目为2,由gl_MaxTextureImageUnits = 2定义。这对于ES 2.0来说太低了吗?

选项1:是的,纹理单元的数量是片段着色器的限制因素。 从ES 1.0到ES 1.1,纹理单元的数量从1增加到2,因此ES 2.0应该加倍(即4)。

选项2:增加到8。

A:增加到8。

 

10.27 目标错误报告

是否应该要求编译器在编译时报告任何错误,或者可以将错误推迟到链接时间?

A:如果无法编译程序,则只需要向目标编译器报告发生了错误。可能在编译时或链接时或两者都报告此错误。开发系统必须在编译时生成语法错误。

 

10.28 整数出发的舍入

是否应为整数除法指定舍入模式?

除法的舍入模式与余数运算符的定义有关。大多数语言中的重要关系(但在此版本的GLSL ES中无关)是:

(a / b)* b + a%b = a(a和b是整数)

通常,余数运算符被定义为具有与被除数相同的符号,这意味着除数必须向零舍入。(注意,mod函数与余数函数不同。mod被定义为与除数具有相同的符号)。

由于余数运算符不是GLSL ES 1.00的一部分,因此不必指定舍入模式。

A:对于此版本的规范,未定义舍入模式。

 

10.29 未定义的返回值

如果使用非void返回类型声明函数,则定义中的任何return语句都必须指定返回表达式,其类型与返回类型匹配。但是,如果函数返回而未执行return语句,则行为为未定义的。编译器是否应该尝试检查这些情况并将其报告为错误?

例如:

int f()
{
 // no return statement
}
...
int a = f();

选项1:将未定义的值返回给调用者。 没有生成错误。 这是大多数c ++编译器在实践中所做的事情(尽管c ++标准实际上指定了“未定义的行为”)。

选项2:在返回值的所有函数定义的末尾必须有一个return语句。

不,这需要添加可能无法执行的语句。

选项3:只有在执行到达函数末尾时才需要函数定义末尾的return语句:

例如:

int f(bool b)
{
 if (b)
 return 1;
 else
 return 0;
 // 没错。 执行永远不会到达函数的末尾,因此永远不会执行隐式return语句。
}

在存在循环的情况下,这变得不可能确定。

选项4:通过函数定义的所有有限静态路径必须以return语句结束。如果可以独立控制代码中的每个分支,则静态路径是可能采用的路径。

A:选项1:该函数返回一个未定义的值(不会报错)

 

版权:https://blog.csdn.net/flycatdeng/article/details/88771466

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值