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 текстуры.
Сам код смешивания прост и находится в пик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
Добрый день !
ОтветитьУдалитьЕсли не трудно , не могли бы Вы модифицировать
данный проект :
http://depositfiles.com/files/j4uqmbmhg
с использованием OpenGl.
1. Вывод графики осуществляется в потоке :
Фон( PNG без прозрачности) + много разных спрайтов PNG c прозрачностью . Вся графика не маштабируется , т.е. выводится один в один.
grizlikoff@gmail.com
Боюсь у меня не так много времени, чтобы этим заняться. Возможно позже, но вам же это нужно как можно скорее?
Удалить