1

我在 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 坐标吗?

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

在此处输入图像描述

4

0 回答 0