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

目录

10.10 重新定义内置函数

10.11 常量表达式

10.12 易变变量链接

 10.13 gl_Position


10.10 重新定义内置函数

如果重新定义内置函数,新函数是否应隐藏所有具有相同名称的内置函数?

A:是的,这遵循c ++规则。 然后,内置函数位于“外部”范围内,全局范围嵌套在此范围内。

 

这特征有用吗? 内置函数可能有效地映射到硬件。 用户定义的函数可能效率不高,但可能能够提供更高的精度(例如,对于三角函数)。

然后,应用程序可能希望访问原始函数和新函数。一些用户定义的函数将受益于对原始函数的访问。 一旦声明了新函数,就隐藏了原始函数,因此使用当前规范这些情形都是不可能的。

选项1:删除重新定义内置函数的功能。 允许它们重载。 这会与桌面产生微妙的不兼容:

int sin(int x) {return x;}

void main()

     float a = sin(1.0); // 在ES中是合法的,但是在桌面GL是不合法的

选项2:删除重新定义或重载函数的功能。

R:内置函数驻留在外部作用域中,与全局作用域不同。但是,不允许重新定义功能。 允许内置函数的重载。

 

10.11 常量表达式

内置函数是否允许传入常量?例如:

const float a = sin(1.0);

选项1:是的,这很有用。

选项2:否。如果重新定义了内置函数,那么确保它是常量变得非常困难。 它还需要在编译时评估用户定义的函数。

选项3:是,但如果重新定义功能则不可以。 这允许常见用例但引入非正交性。

选项4:是并允许将用户定义的函数定义为const

A:允许内置函数中传入常量,现在禁止重新定义内置函数。常量表达式中不允许传入到用户定义的函数。

 

10.12 易变变量链接

在顶点着色器中,特定的易变变量可能是1)未声明的,2)声明但未写入值,3)声明和写入但不是在所有可能的路径中或4)在所有路径中声明和写入。同样,片段着色器中的变化可以是a)未声明,b)声明但未读取,c)在某些路径中声明和读取,或d)在所有路径中声明和读取。 这4*4=16种组合中的哪一种会产生错误?

编译器不应尝试发现是否在所有可能的路径中读取或写入变化。 这对ES来说太复杂了。

相同的顶点着色器可以与不同的片段着色器配对。这些片段着色器可以使用可用输入易变变量的子集。所以这种行为是不会导致出错的。因此,如果顶点着色器写入片段着色器未声明或声明但未读取的变化,那么这不是错误。

 

如果顶点着色器声明但不写入变量并且片段着色器声明有读取它,这是一个错误吗?

A:不是。

A:唯一的错误情况是片段着色器声明和读取变量但未在顶点着色器中声明这个易变变量

 

 10.13 gl_Position

如果顶点着色器没有写入gl_Position,这是一个错误吗?着色器是否写入gl_Position不能总是被确定的,例如 如果依赖于属性变量。

选项1:不,这不是错误。 在这种情况下,行为是未定义的。 在这种情况下,开发系统应该发出警告,但是目标编译器不必检测这一点。

选项2:如果顶点着色器没有静态写入gl_Position,则会出错。

选项3:如果通过着色器的任何静态路径未写入gl_Position,则会出错。

A:没有错误(选项1)。 但是必须指定未定义行为的性质。

 

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

Android,OpenGL ES,图形学
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值