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