我在 OpenGL ES3 中有以下关于实例化的问题
我在一次绘制调用中绘制了 64 个形状 - 三角形。好的!
然后我想给形状单独的眼睛,它们在“眨眼”。闪烁表示图集中的不同偏移量(即不同的 uv 坐标)。我可以轻松地为具有相同眼睛状态的所有形状进行一次绘制调用,但如果我希望这些形状处于不同的闪烁模式 - 我如何通过实例化来完成它。方法签名不允许
GLES30.glDrawArraysInstanced(GLES30.GL_TRIANGLES, (vertexOffset + bitmapIndex) * CreateGLContext.N_RECT_VERTS, CreateGLContext.N_RECT_VERTS, nShapes);
顶点偏移是缓冲区中的位置,假设第一只眼睛的位置为 59。下一个为 60,依此类推。共有 7 种眼状态和 uv 坐标
所以我有 64 种形状,因为我希望它们有自己的闪烁状态,这意味着不同的偏移量.. 我不知道如何只用一个绘图调用来完成它。
BlinkingEyes 类中的绘制方法
@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;
片段着色器的片段
in vec2 v_TexCoordinate;
uniform sampler2D u_Texture;
fragmentColor = texture(u_Texture, v_TexCoordinate);
这个问题有解决方案吗?我可以将信息发送到着色器并告诉它为不同的形状使用不同的 uv 坐标吗?
眼睛(来自地图集的片段)