OpenGL / GLSL运行时错误处理

xXliolauXx

这是一个普遍的问题。我没有在网上找到任何有关此的资源,但是我认为值得在某个地方进行记录。

例如,如果正在尝试访问当前值为Null的统一,Shader Runtime(不是编译错误)将如何处理?

线程只是被中止了吗?会产生垃圾值吗?它是否与驱动程序/硬件相关?

BDL

对于“普通”统一变量,我看不到它们如何引起运行时错误。由于它们都是原始类型,因此不可能使用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中断或终止。

取决于实现。

结论

在着色器中获取运行时异常的唯一方法似乎是当统一块尝试访问未由缓冲区支持的变量时。据我所知,在着色器内无法处理这种情况。

GLSL 4.5规格

OpenGL 4.5规范

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在运行时处理 OpenGL 错误

来自分类Dev

OpenGL错误处理最佳做法

来自分类Dev

在Windows上测量Opengl的运行时间?

来自分类Dev

放置错误处理程序后出现运行时错误 1004?

来自分类Dev

运行时错误 438 不会触发错误处理程序

来自分类Dev

IDE 会在设置错误处理程序时引发 Excel VBA 运行时错误

来自分类Dev

错误处理不适用于 excel-vba 中的运行时错误 9

来自分类Dev

GLEW(OpenGL扩展牧马人):在运行时加载opengl dll吗?

来自分类Dev

从SFML提供的X11句柄创建Irrlicht设备。运行时X11 / OpenGL错误

来自分类Dev

OpenGL GLSL GLUT冲突

来自分类Dev

OpenGL GLSL 日志

来自分类Dev

运行时出现批处理错误

来自分类Dev

处理 400 后的运行时错误

来自分类Dev

作为子进程运行时,OpenGL窗口未在xcode(7.2)中打开

来自分类Dev

opengl程序可以编译,但运行时会出错(UBUNTU 14.04)

来自分类Dev

opengl程序可以编译,但运行时会出错(UBUNTU 14.04)

来自分类Dev

Genymotion openGL错误

来自分类Dev

报告错误的OpenGL版本

来自分类Dev

QT OpenGL链接错误

来自分类Dev

OPENGL操作错误

来自分类Dev

OpenGL纹理坐标错误

来自分类Dev

错误安装了OpenGL

来自分类Dev

报告错误的OpenGL版本

来自分类Dev

QT OpenGL链接错误

来自分类Dev

OpenGL 土壤错误

来自分类Dev

在Hive中处理行时出现Hive运行时错误

来自分类Dev

Converting GLSL modern OpenGL 3.2

来自分类Dev

对GLSL和OpenGL感到困惑

来自分类Dev

转换GLSL现代OpenGL 3.2