OpenGL ES 2.0 GLSL渲染具有独特纹理的多个精灵

时间:2016-01-10 04:42:20

标签: android opengl-es glsl

我正在创建一个非常简单的Android游戏,它有各种精灵,使用不同的纹理地图集。纹理图集存储为不同的图像文件。使用OpenGL ES 2.0将这些不同的纹理渲染到不同的精灵的最有效方法是什么?

目前,我每次将精灵渲染到游戏画面时都会重新加载每个精灵纹理,我意识到根本没有效果。我希望能够将纹理地图一次上传到GPU,然后使用GPU内存中的缓存纹理渲染到相应的精灵顶点。

下面是我的顶点和片段着色器GLSL代码。以下是我的问题:

  1. 有没有办法更改着色器以将多个纹理独立渲染到不同的顶点(即在屏幕上渲染不同的精灵)?
    1. 我是否必须使用这些着色器创建多个OpenGL程序(使用专用于渲染特定精灵的每个OpenGL程序编译着色器多个?(也似乎效率不高)
    2. 我在OpenGL ES 2.0上发现的大部分书籍都有纹理着色示例,仅包含单个纹理的着色。我在网上找到的其他例子演示了使用多个重叠纹理。我还没有找到一个关于用不同纹理着色不同顶点的有效方法的来源,所以非常感谢你给我的任何见解。

      此外,如何更新GPU内存中的顶点缓冲区(即精灵在屏幕上的位置),而无需更改Java中的值,然后将它们重新写回GPU?这有什么好的GLSL功能吗?为了避免CPU核心和GPU之间出现类似的内存抖动?

      提前感谢您提出的任何建议 - 我对OpenGL和GLSL都很陌生。

      ^ _ ^

      顶点着色器:

      precision highp float;
      uniform mat4 u_orthMatrix;
      attribute vec4 a_position;
      attribute vec2 a_inputTextureCoordinate;
      varying vec2 v_textureCoordinate;
      
      void main() {
          gl_Position = u_orthMatrix * a_position;
          v_textureCoordinate = a_inputTextureCoordinate;
      }
      

      片段着色器:

      precision mediump float;
      varying vec2 v_textureCoordinate;
      uniform sampler2D u_texture;
      
      void main() {
          gl_FragColor = texture2D(u_texture, v_textureCoordinate);
      }
      

0 个答案:

没有答案