Ric*_*k77 2 opengl-es glsl opengl-es-3.0
我正在尝试创建一个übershader来表示一些可能不包含某些属性的波前数据,例如:
uv坐标和纹理等等。
现在,为此创建一个übershader可能是(或不是)一个好主意(我正在实验),但是我面临的问题是指定了某些属性而没有指定某些属性(缺少制服,例如未设置纹理采样器)用布尔制服进行处理,以开启和关闭采样功能)。
是什么在GLSL 3.00 v发生时的属性都 没有被分配(这意味着没有glEnableVertexAttribArray,比如,还没有缓冲势必/任何东西),并没有在GLSL程序用于读取(例如,我将使用一个统一的boolean,以转缺少UV坐标时,可以进行纹理查找,尽管我仍然可以在顶点着色器和片段着色器之间插入/插入坐标,如下所示:
// Vertex shader
in vec3 vn;
out vec3 fvn;
[...]
fvn = vn;
Run Code Online (Sandbox Code Playgroud)
...)?
这是对glsl的合法使用吗?还是会引起奇怪的兼容性问题(正如OpenGL ES3.0标签所暗示的,我正在为移动设备开发)?
我正在寻找第一手经验或权威信息,
谢谢!
始终指定属性。您可以选择是否从数组中获取它们,或者是否使用当前值。
要使用数组中的数据,请调用:
glEnableVertexAttribArray(loc);
Run Code Online (Sandbox Code Playgroud)
启用属性数组后,将从GL_ARRAY_BUFFER最后一次glVertexAttribPointer()调用时绑定的缓冲区中获取属性。
要使用当前属性值,请调用:
glDisableVertexAttribArray(loc);
Run Code Online (Sandbox Code Playgroud)
禁用属性数组后,用于该属性的值由上次调用glVertexAttrib4f(),或同一glVertexAttrib*()系列的另一个函数提供,如果您从未调用过任何函数,则默认值为(0.0,0.0,0.0,1.0) 。
因此,不必担心具有“未指定”属性,因为它从未真正未被指定。您唯一需要注意的是,您必须在未使用指定有效数组的情况下启用属性数组glVertexAttribPointer()。最安全的方法是调用glDisableVertexAttribArray()不使用的属性。