2016-01-03 66 views
0

我试图创建一个übershader表示这可能会有些波阵面数据或可能不包含一些属性,如:GLSL着色器可选属性

  1. 一个或多个对象可能包含uv坐标和纹理
  2. 一个或多个对象可能包含正常映射为每个顶点
  3. 一种或多种材料可能具有不同的照明类型来呈现,并且包含用于凹凸映射纹理

等。

现在,它可能或可能不是一个好主意,为此创建一个ubershader(我正在尝试),但我面临的问题是一些属性被指定,一些不是(缺少制服,如纹理未设置采样器的布尔值统一可以打开和关闭采样功能)。

是什么在GLSL v 3.00发生时的属性是未分配(这意味着没有glEnableVertexAttribArray,例如,还没有绑定任何/任何缓冲液)在GLSL程序不用于阅读(例如,我将使用一个统一的boolean把纹理查找关闭,当UV坐标缺失,但我仍然会插的坐标为顶点和片段着色器之间的输入/输出,像这样:

// Vertex shader 
in vec3 vn; 
out vec3 fvn; 

[...] 

fvn = vn; 

...)?

这是glsl的合法使用,还是会产生奇怪的兼容性问题(我正在开发移动设备,正如OpenGL ES3.0标记所暗示的)?

我正在寻找第一手经验或权威来源,

谢谢!

+1

你是什么意思“既没有指定也没有使用”?具体由“未指定”? –

+0

@NicolBolas谢谢你的评论(我的解释不清楚)!我会立即纠正这个问题,尽管我认为Reto的答案能够解决我的问题。 – Rick77

回答

3

属性始终指定。您可以选择是从数组中提取数据,还是使用当前值。

从数组中使用的数据,你叫:

glEnableVertexAttribArray(loc); 

当启用该属性阵列,该属性是从被绑定为GL_ARRAY_BUFFER最后glVertexAttribPointer()调用时缓冲区中取出。

要使用当前属性值,你可以调用:

glDisableVertexAttribArray(loc); 

虽然属性阵列被禁用,使用该属性的值由上次调用glVertexAttrib4f()或其它功能从同一glVertexAttrib*()给出家庭,如果您从未调用任何这些功能,则默认值为(0.0,0.0,0.0,1.0)。

因此,具有“未指定”属性不是一个问题,因为它从来没有真正没有指定。唯一需要注意的是,如果没有指定一个有效数组glVertexAttribPointer(),则不启用属性数组。最安全的方法是,您可以拨打glDisableVertexAttribArray()来获取您未使用的属性。

+0

非常感谢您提供非常清楚和详尽的解释:这正是我一直在寻找的! “glVertexAttrib *”的“后备”尤其是我正在寻找的东西,这是一件很好的事情。 – Rick77