Texture1:



Vertex Shader:
Nothing fancy here, simple shader that passes texture co-ordinates to Fragment shader and sets vertex position.String strVShader ="attribute vec4 a_position;" +"attribute vec2 a_texCoords;" +"varying vec2 v_texCoords;" +"void main()" +"{" +"v_texCoords = a_texCoords;" +"gl_Position = a_position;" +"}";
Fragment shader:
This is where we will make few changes to mix/blend textures.
Here, get the color values from the texture at the co-ordinates and manipulate them as you like. here i just multiplied 2 color vectors.String strFShader ="precision mediump float;" +"varying vec2 v_texCoords;" +"uniform sampler2D u_texId1;" +"uniform sampler2D u_texId2;" +"void main()" +"{" +"vec4 color1 = texture2D(u_texId1, v_texCoords);" +"vec4 color2 = texture2D(u_texId2, v_texCoords);" +"gl_FragColor = color2 * color1;" +"}";
There is no much changes in remaining renderer code. but, we will see draw function.
Apart from passing vertex positions and texture co-ordinates, we have activated 2 textures (GL_TEXTURE0 and GL_TEXTURE1) for passing texture ids to shaders. we can go upto 32 textures. and as usual draw triangles or triangle fan to draw quad.public void onDrawFrame(GL10 gl) {GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);GLES20.glUseProgram(iProgId);GLES20.glVertexAttribPointer(iPosition, 3, GLES20.GL_FLOAT, false, 0, vertexBuffer);GLES20.glEnableVertexAttribArray(iPosition);GLES20.glVertexAttribPointer(iTexCoords1, 2, GLES20.GL_FLOAT, false, 0, texBuffer);GLES20.glEnableVertexAttribArray(iTexCoords1);GLES20.glActiveTexture(GLES20.GL_TEXTURE0);GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, iTexIds[0]);GLES20.glUniform1i(iTex1, 0);GLES20.glActiveTexture(GLES20.GL_TEXTURE1);GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, iTexIds[1]);GLES20.glUniform1i(iTex2, 1);// GLES20.glDrawArrays(GLES20.GL_TRIANGLE_FAN, 0, 4);GLES20.glDrawElements(GLES20.GL_TRIANGLES, 6, GLES20.GL_UNSIGNED_SHORT, indecesBuffer);}
No comments:
Post a Comment