понедельник, 2 мая 2011 г.

OpenGL ES 2.0 на android. MultiTexturing

MultiTexturing - это простая техника, с помощью которой можно смешивать 2 и более текстуры. Данная техника применяется, например, для отображения света фонарика на стене.

В моем примере используются 2 текстуры.



Сам код смешивания прост и находится в пикcельном шейдере (fragment shader):


            precision mediump float;            
            uniform sampler2D s_baseMap;
            uniform sampler2D s_lightMap;  
            void main()                                
           {                                                
              vec4 baseColor;                              
              vec4 lightColor;                                
              baseColor = texture2D( s_baseMap, gl_PointCoord );
              lightColor = texture2D( s_lightMap, gl_PointCoord );
              gl_FragColor = baseColor * (lightColor + 0.25);      
            }                                                

s_baseMap  и s_lightMap это как раз наши текстуры, значения в них заполняются при инициализации шейдера. Код при прорисовке фрейма onDraw:


        // Use the program object
        GLES20.glUseProgram(mProgramObject);

        // Load the vertex position
        mVertices.position(0);
        GLES20.glVertexAttribPointer ( mPositionLoc, 3, GLES20.GL_FLOAT,
                                       false,
                                       5 * 4, mVertices );
        // Load the texture coordinate
        mVertices.position(3);
        GLES20.glVertexAttribPointer ( mTexCoordLoc, 2, GLES20.GL_FLOAT,
                                       false,
                                       5 * 4,
                                       mVertices );

        GLES20.glEnableVertexAttribArray ( mPositionLoc );
        GLES20.glEnableVertexAttribArray ( mTexCoordLoc );


        // Bind the base map
        GLES20.glActiveTexture ( GLES20.GL_TEXTURE0 );
        GLES20.glBindTexture ( GLES20.GL_TEXTURE_2D, mBaseMapTexId );

        // Set the base map sampler to texture unit to 0
        GLES20.glUniform1i ( mBaseMapLoc, 0 );

        // Bind the light map
        GLES20.glActiveTexture ( GLES20.GL_TEXTURE1 );
        GLES20.glBindTexture ( GLES20.GL_TEXTURE_2D, mLightMapTexId );
      
        // Set the light map sampler to texture unit 1
        GLES20.glUniform1i ( mLightMapLoc, 1 );

        GLES20.glDrawElements ( GLES20.GL_POINTS, 6, GLES20.GL_UNSIGNED_SHORT, mIndices );


Исходный код проекта можно посмотреть здесь: http://code.google.com/p/android-opengles-samples-for-vikulov-blogspot-com/source/browse/#svn%2Ftrunk%2FopenGlSprites.
В нем так же показано как использовать режим прорисовки точек GL_POINTS, как пользоваться gl_PointSize и gl_PointCoord

2 комментария:

  1. Добрый день !
    Если не трудно , не могли бы Вы модифицировать
    данный проект :
    http://depositfiles.com/files/j4uqmbmhg
    с использованием OpenGl.
    1. Вывод графики осуществляется в потоке :
    Фон( PNG без прозрачности) + много разных спрайтов PNG c прозрачностью . Вся графика не маштабируется , т.е. выводится один в один.

    grizlikoff@gmail.com

    ОтветитьУдалить
    Ответы
    1. Боюсь у меня не так много времени, чтобы этим заняться. Возможно позже, но вам же это нужно как можно скорее?

      Удалить