OpenGL - 使用不同的多边形一个drawcall - 实例化

时间:2017-11-22 12:16:49

标签: android opengl-es opengl-es-3.0

我在我的Android游戏中使用OpenGL ES版本3并实现了实例化。如果我使用相同大小/尺寸的相同顶点的多边形,它的效果很好。如果我想为每一帧创建更改精灵状态,我可以跳转到纹理图集的不同UV坐标。

v_TexCoordinate = a_TexCoordinate + uvCoordsOffset[gl_InstanceID];

那就是..我只是用一个由偏移坐标组成的均匀vec来改变纹理坐标。

但是 - 问题来了。

如果我想做同样但具有不同尺寸的精灵怎么办?

在drawcall中......

GLES30.glDrawElementsInstanced(GLES30.GL_TRIANGLES, 6,  GLES20.GL_UNSIGNED_SHORT, indexOffset, nFallingObj);

我只能发送一个多边形,即截图中的绿色恐龙顶点。我把它作为基本多边形,我想要达到地图集的红色恐龙。如上所述,我可以使用纹理偏移轻松完成此操作但是你看它是怎么变成的?使用了绿色恐龙的多边形,但我想要改变红色恐龙的颜色。

这个问题有没有简单的解决方案? 提前谢谢!!!

一些源代码

draw-method

      public void drawFallingObjects() {

        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);


        GLES30.glUniform2fv(uvCoordsOffsetLoc, nFallingObj, uvOffsetVec, 0);
        GLES30.glUniformMatrix4fv(mMVPMatrixHandle, nFallingObj, false, mMVPMatrixMajor, 0);

        GLES30.glDrawElementsInstanced(GLES30.GL_TRIANGLES, 6, GLES20.GL_UNSIGNED_SHORT, indexOffset, nFallingObj);

    }

顶点着色器代码

  void main()                                                   
{

   v_Color = a_Color;

   v_TexCoordinate = a_TexCoordinate + uvCoordsOffset[gl_InstanceID];

   gl_Position =  u_MVPMatrix[gl_InstanceID] * a_Position;

}   

enter image description here

1 个答案:

答案 0 :(得分:0)

  

如果我想做同样的事情但是有不同的精灵怎么办?   尺寸?

您的MVP矩阵可以编码缩放和倾斜,这是调整屏幕精灵大小所需的全部内容。