我在OpenGL ES3中有关于实例化
的以下问题我在一个drawcall中绘制了64个形状 - 三角形。 OK!
然后我想给各个人的眼睛形状,他们是“眨眼”。闪烁意味着图谱中的不同偏移(即,不同的uv-coords)。 我可以轻松地为所有具有相同眼睛状态的形状做一个drawcall,但如果我希望形状处于不同的闪烁模式 - 我怎么能用实例来完成它。方法签名不允许
GLES30.glDrawArraysInstanced(GLES30.GL_TRIANGLES, (vertexOffset + bitmapIndex) * CreateGLContext.N_RECT_VERTS, CreateGLContext.N_RECT_VERTS, nShapes);
vertexoffset是缓冲区中的位置,让第一只眼睛有位置59.接下来是60,依此类推。共有7种眼睛状态和uv-coords
所以我有64个形状,因为我希望它们有自己的闪烁状态,这意味着不同的偏移..我不知道如何通过一次绘制调用来完成它。
BlinkingEyes类中的draw方法
@Override
public void draw() {
GLES30.glUseProgram(mProgramHandle);
GLES30.glEnableVertexAttribArray(mPositionHandle);
GLES30.glVertexAttribPointer(mPositionHandle, CreateGLContext.POSITION_DATA_SIZE, GLES20.GL_FLOAT, false, CreateGLContext.STRIDE, 0);
GLES30.glEnableVertexAttribArray(mTextureCoordinateHandle);
GLES30.glVertexAttribPointer(mTextureCoordinateHandle, CreateGLContext.TEXTURE_COORDINATE_DATA_SIZE, GLES20.GL_FLOAT, false,
CreateGLContext.STRIDE, CreateGLContext.POSITION_DATA_SIZE * CreateGLContext.BYTES_PER_FLOAT);
setLargeMVPmatrix();
GLES30.glUniformMatrix4fv(mMVPMatrixHandle, nShapes, false, mMVPMatrixMajor, 0);
GLES30.glDrawArraysInstanced(GLES30.GL_TRIANGLES, (vertexOffset + bitmapIndex) * CreateGLContext.N_RECT_VERTS, CreateGLContext.N_RECT_VERTS, nShapes);
}
来自顶点着色器的片段
uniform mat4 u_MVPMatrix[64];
in vec4 a_Position;
v_TexCoordinate = a_TexCoordinate;
gl_Position = u_MVPMatrix[gl_InstanceID] * a_Position;
来自fragment-shader的片段
in vec2 v_TexCoordinate;
uniform sampler2D u_Texture;
fragmentColor = texture(u_Texture, v_TexCoordinate);
这个问题有解决方法吗?我是否可以将信息发送到着色器并告诉它使用不同形状的uv-coords?
眼睛(来自地图集的片段)