绑定自定义顶点属性以在着色器中使用

时间:2014-04-25 02:55:39

标签: opengl opengl-es glkit

我正在编写一个着色器,根据与顶点关联的特定值执行不同的操作。下面是存储顶点信息的结构:

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以验证我实际上没有获得正确的值。我还缺少一个额外的步骤吗?

0 个答案:

没有答案