我正在编写一个着色器,根据与顶点关联的特定值执行不同的操作。下面是存储顶点信息的结构:
typedef struct
{
GLKVector3 position;
GLKVector3 normal;
GLKVector2 texCoords0;
GLKVector4 originalColor;
GLushort isEmissive;
GLushort colorIndex;
} Vertex;
重要变量是isEmissive
。我想根据这个变量在我的片段着色器中处理不同的光照/颜色效果 - 它本质上是一个BOOL(1或0)。由于它与我的顶点信息相关联,我认为我可以在我的顶点着色器中设置attribute
属性,但似乎并非如此。有没有办法将顶点信息的自定义属性添加/绑定到顶点着色器?我现在在顶点着色器中使用的所有属性都是标准的 - GLKVertexAttribPosition,GLKVertexAttribNormal,GLKVertexAttribColor,GLKVertexAttribTexCoord0 - 或者使用GLKit中的NS_ENUMs。我需要做些什么来绑定我自己的属性才能在顶点着色器中使用?我尝试过绑定isEmissive
,但在我的着色器中它始终为0。我想让它反映创建顶点时的值。我觉得我需要将这些数据绑定到缓冲区,以便GPU上的顶点信息可以访问这些数据。
更新 - 我在下面的评论中添加了以下代码。我将指针设置到顶点数组对象中,指定我需要的数据位置。它是一个浮动值 - 0或1。
// emissive bool
glEnableVertexAttribArray(ATTRIB_EMISSIVE);
glVertexAttribPointer(ATTRIB_EMISSIVE, 1, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLbyte *)NULL + offsetof(Vertex, isEmissive));
然后在我的着色器程序中,我添加了以下内容来绑定属性:
glBindAttribLocation(_program, ATTRIB_EMISSIVE, "isEmissive");
最后,作为测试值是否有效的测试我在着色器中有以下内容:
// calculate new color based on time
if (isEmissive > 0.5) {
colorVarying = vec4(0, 1, 0, 1);
} else {
colorVarying = vec4(1, 0, 0, 1);
}
isEmissive始终为0.我已明确将其设置为1以验证我实际上没有获得正确的值。我还缺少一个额外的步骤吗?