为什么这个OpenGL ES阵列实例化示例不起作用?

时间:2015-08-08 04:32:42

标签: ios swift opengl-es opengl-es-3.0

我正在尝试遵循Apple的OpenGL ES编程指南中有关实例化绘图的建议:Use Instanced Drawing to Minimize Draw Calls。我已经开始使用XCode为OpenGL和Swift的游戏应用程序生成的示例项目,并将其转换为OpenGL ES 3.0,添加一些实例化绘图来复制多维数据集。

当我使用gl_InstanceID技术并简单地从中生成偏移时,这可以正常工作。但是当我尝试使用'instanced arrays'技术通过缓冲区传递数据时,我没有看到任何结果。

我更新的顶点着色器如下所示:

#version 300 es

in vec4 position;
in vec3 normal;
layout(location = 5) in vec2 instOffset;

out lowp vec4 colorVarying;

uniform mat4 modelViewProjectionMatrix;
uniform mat3 normalMatrix;

void main()
{
    vec3 eyeNormal = normalize(normalMatrix * normal);
    vec3 lightPosition = vec3(0.0, 0.0, 1.0);
    vec4 diffuseColor = vec4(0.4, 0.4, 1.0, 1.0);

    float nDotVP = max(0.0, dot(eyeNormal, normalize(lightPosition)));

    colorVarying = diffuseColor * nDotVP;

//    gl_Position = modelViewProjectionMatrix * position + vec4( float(gl_InstanceID)*1.5, float(gl_InstanceID)*1.5, 1.0,1.0);
    gl_Position = modelViewProjectionMatrix * position + vec4(instOffset, 1.0, 1.0);

}

在我的setupGL()方法中,我添加了以下内容:

//glGenVertexArraysOES(1, &instArray)  // EDIT: WRONG
//glBindVertexArrayOES(instArray)      // EDIT: WRONG
let kMyInstanceDataAttrib = 5
glGenBuffers(1, &instBuffer)
glBindBuffer(GLenum(GL_ARRAY_BUFFER), instBuffer)
glBufferData(GLenum(GL_ARRAY_BUFFER), GLsizeiptr(sizeof(GLfloat) * instData.count), &instData, GLenum(GL_STATIC_DRAW))
glEnableVertexAttribArray(GLuint(kMyInstanceDataAttrib))
glVertexAttribPointer(GLuint(kMyInstanceDataAttrib), 2, GLenum(GL_FLOAT), GLboolean(GL_FALSE), 0/*or 8?*/, BUFFER_OFFSET(0))
glVertexAttribDivisor(GLuint(kMyInstanceDataAttrib), 1);

以及一些简单的实例偏移数据:

var instData: [GLfloat] = [
    1.5, 1.5,
    2.5, 2.5,
    3.5, 3.5,
]

我使用与实例id技术相同的方式绘制:

glDrawArraysInstanced(GLenum(GL_TRIANGLES), 0, 36, 3)

但似乎没有效果。我只是得到了单个立方体,如果我删除了缓冲区设置,它甚至看起来都不会失败,所以我怀疑我的设置丢失了。

编辑:通过从init中删除两个虚假行来修复代码。

1 个答案:

答案 0 :(得分:0)

我有一个不必要的gen并绑定属性顶点数组。上面编辑的代码现在有效。