这是一个普遍的问题。我没有在网上找到任何有关此的资源,但是我认为值得在某个地方进行记录。
例如,如果正在尝试访问当前值为Null的统一,Shader Runtime(不是编译错误)将如何处理?
线程只是被中止了吗?会产生垃圾值吗?它是否与驱动程序/硬件相关?
对于“普通”统一变量,我看不到它们如何引起运行时错误。由于它们都是原始类型,因此不可能使用NULL之类的值。所有这些变量都在链接时初始化。规格说明:
2.15.3.1
所有统一变量都是只读的,并且可以在链接时或通过API在外部进行初始化。链接时初始值是变量的初始化程序(如果存在)的值,或者是0(如果没有初始化程序存在)。
但是,这里还有另外两种有趣的制服类型:
采样器制服
采样器也被初始化为零,这意味着它们指向纹理0。根据OpenGL规范:
8.1
纹理对象的名称空间是无符号整数,GL保留零以表示默认纹理对象。默认纹理对象绑定到每个TEXTURE_1D,TEXTURE_2D,TEXTURE_3D,TEXTURE_1D_ARRAY,TEXTURE_-2D_ARRAY,TEXTURE_RECTANGLE,TEXTURE_BUFFER,TEXTURE_CUBE_MAP,TEXTURE_CUBE_MAP_ARRAY,TEXTURE_D_MULTISAMPLE和TEXTURE_D_MULTISAMPLE,TEXTURE_DEST_TEXT。
这基本上意味着,在这里也不可能生成任何运行时异常。此处的答案表示从纹理0读取时会发生什么。
均匀块
由UBO或SSBO存储支持的含义统一。这似乎是根据:
如果没有足够大的缓冲区对象支持任何活动的统一块,则着色器执行的结果不确定,并且可能导致GL中断或终止。
取决于实现。
结论
在着色器中获取运行时异常的唯一方法似乎是当统一块尝试访问未由缓冲区支持的变量时。据我所知,在着色器内无法处理这种情况。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句