OpenGL ES - 实例化 - 不同的uv-coord one drawcall

时间:2017-09-23 08:30:56

标签: android opengl-es-3.0 gldrawarrays

我在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?

眼睛(来自地图集的片段)

enter image description here

0 个答案:

没有答案