Opengl es OpenGL ES 2:制服和属性

Opengl es OpenGL ES 2:制服和属性,opengl-es,Opengl Es,众所周知,统一和属性是GPU中的寄存器。我的问题是当不同的程序绑定时会发生什么?标准是否保证以前设置的制服和/或属性指针将被重新加载,或者我需要在任何情况下手动重新加载它们?我想创建一个缓存系统。在我看来,当程序反弹时,属性不会重新加载(是吗?),那么制服呢?GL ES驱动程序是否为我重新加载其值?否,制服和属性是GPU中的寄存器,这一点尚不清楚。事实上,至少在一个广泛部署的OpenGLES2.0GPU中是错误的 除非显式初始化,否则一致性为零。统一值是程序对象之后的状态。换句话说,如果在给定程

众所周知,统一和属性是GPU中的寄存器。我的问题是当不同的程序绑定时会发生什么?标准是否保证以前设置的制服和/或属性指针将被重新加载,或者我需要在任何情况下手动重新加载它们?我想创建一个缓存系统。在我看来,当程序反弹时,属性不会重新加载(是吗?),那么制服呢?GL ES驱动程序是否为我重新加载其值?

否,制服和属性是GPU中的寄存器,这一点尚不清楚。事实上,至少在一个广泛部署的OpenGLES2.0GPU中是错误的

除非显式初始化,否则一致性为零。统一值是程序对象之后的状态。换句话说,如果在给定程序对象上设置统一,则可以依赖于在同一程序对象的不同使用中保留的值,但不能依赖于在多个程序对象中保留的给定位置上的统一。事实上,这样做的OpenGL ES实现将违反规范。这不是未定义的行为


属性指针是全局上下文状态,您可以在调用同一OpenGL ES上下文之间依赖于这些指针进行保留。当前属性值也是如此(通过glVertexAttribute*-函数设置)

我在OpenGL ES规范中发现“制服是程序对象特定的状态。加载后它们保留其值,只要程序对象没有重新链接,只要使用程序对象,它们的值就会恢复”。所以如果它的值保持不变,我可以保持它不变。关于属性。我的实验表明不同:如果我在指针和缓冲区相同的情况下跳过glVertxAttribPointer,视觉上就会出现错误,甚至出现黑屏。但是glGetError还可以。关于制服的部分基本上就是我说的。关于属性,是否确定尝试重用的属性具有相同的属性位置?如果没有,您可以在链接程序之前尝试使用glBindAttribLocation来确保。我希望我可以+1两次。一个代表正确答案,一个代表“寄存器”标题。顺便说一句,你知道哪个GPU做不到这一点?对不起,我无权告诉你。