2015-08-08 27 views
0

我试图按照苹果的OpenGL ES编程指南中有关实例化绘图的建议:Use Instanced Drawing to Minimize Draw Calls。我已经开始使用XCode为带有OpenGL和Swift的游戏应用程序生成的示例项目,并将其转换为OpenGL ES 3.0,添加了一些实例化图形以复制多维数据集。为什么OpenGL ES阵列实例无法运行?

这工作正常,当我使用gl_InstanceID技术,并简单地生成一个偏移量。但是,当我尝试使用“实例化数组”技术通过缓冲区传递数据时,我没有看到任何结果。

我更新的顶点着色器看起来是这样的:

#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中删除两个伪线来修复代码。

回答

0

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