Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.atm959.openglgame;
- import android.opengl.GLES20;
- import android.opengl.Matrix;
- import java.nio.ByteBuffer;
- import java.nio.ByteOrder;
- import java.nio.FloatBuffer;
- public class Renderer {
- private String vertexShaderCode =
- "attribute vec2 aPos;" +
- "attribute vec2 aTexCoord;" +
- "uniform mat4 projection;" +
- "uniform mat4 model;" +
- "varying vec2 vTexCoord;" +
- "void main(){" +
- " gl_Position = projection * model * vec4(aPos, 0.0, 1.0);" +
- " vTexCoord = aTexCoord;" +
- "}";
- private String fragmentShaderCode =
- "precision mediump float;" +
- "varying vec2 vTexCoord;" +
- "uniform sampler2D tex;" +
- "void main(){" +
- " gl_FragColor = texture2D(tex, vTexCoord);" +
- "}";
- static final float[] vertexCoords = { // in counterclockwise order:
- 0.0f, 0.0f,
- 0.0f, 1.0f,
- 1.0f, 1.0f,
- 0.0f, 0.0f,
- 1.0f, 1.0f,
- 1.0f, 0.0f,
- };
- static final float[] textureCoords = {
- 0.0f, 0.0f,
- 0.0f, 1.0f,
- 1.0f, 1.0f,
- 0.0f, 0.0f,
- 1.0f, 1.0f,
- 1.0f, 0.0f
- };
- static final int COORDS_PER_VERTEX = 2;
- private final int vertexCount = vertexCoords.length / COORDS_PER_VERTEX;
- private final int vertexStride = COORDS_PER_VERTEX * 4;
- private FloatBuffer vertexBuffer;
- private FloatBuffer textureCoordsBuffer;
- private int mProgram;
- private int mPositionHandle;
- private int mTexCoordHandle;
- private int mProjectionMatrixHandle;
- private int mModelMatrixHandle;
- private int mTexHandle;
- float[] projection = new float[16];
- float[] model = new float[16];
- int screenWidth;
- int screenHeight;
- public Renderer(int screenWidth, int screenHeight){
- this.screenWidth = screenWidth;
- this.screenHeight = screenHeight;
- Matrix.setIdentityM(this.projection, 0);
- Matrix.setIdentityM(this.model, 0);
- ByteBuffer bb = ByteBuffer.allocateDirect(vertexCoords.length * 4);
- bb.order(ByteOrder.nativeOrder());
- this.vertexBuffer = bb.asFloatBuffer();
- this.vertexBuffer.put(vertexCoords);
- this.vertexBuffer.position(0);
- bb = ByteBuffer.allocateDirect(textureCoords.length * 4);
- bb.order(ByteOrder.nativeOrder());
- this.textureCoordsBuffer = bb.asFloatBuffer();
- this.textureCoordsBuffer.put(textureCoords);
- this.textureCoordsBuffer.position(0);
- int vertexShader = MyGLRenderer.loadShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode);
- int fragmentShader = MyGLRenderer.loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode);
- this.mProgram = GLES20.glCreateProgram();
- GLES20.glAttachShader(this.mProgram, vertexShader);
- GLES20.glAttachShader(this.mProgram, fragmentShader);
- GLES20.glLinkProgram(this.mProgram);
- this.mPositionHandle = GLES20.glGetAttribLocation(this.mProgram, "aPos");
- this.mTexCoordHandle = GLES20.glGetAttribLocation(this.mProgram, "aTexCoord");
- this.mProjectionMatrixHandle = GLES20.glGetUniformLocation(this.mProgram, "projection");
- this.mModelMatrixHandle = GLES20.glGetUniformLocation(this.mProgram, "model");
- this.mTexHandle = GLES20.glGetUniformLocation(this.mProgram, "tex");
- }
- public void setScreenSize(int width, int height){
- this.screenWidth = width;
- this.screenHeight = height;
- }
- public void update(){
- Matrix.setIdentityM(this.projection, 0);
- Matrix.orthoM(this.projection, 0, 0.0f, this.screenWidth, this.screenHeight, 0.0f, -1.0f, 1.0f);
- }
- public void renderImageBasic(int x, int y, int width, int height, int texUnit){
- ByteBuffer bb = ByteBuffer.allocateDirect(textureCoords.length * 4);
- bb.order(ByteOrder.nativeOrder());
- this.textureCoordsBuffer = bb.asFloatBuffer();
- this.textureCoordsBuffer.put(textureCoords);
- this.textureCoordsBuffer.position(0);
- Matrix.setIdentityM(this.model, 0);
- Matrix.translateM(this.model, 0, x, y, 0.0f);
- Matrix.scaleM(this.model, 0, width, height, 1.0f);
- GLES20.glUseProgram(this.mProgram);
- GLES20.glEnableVertexAttribArray(this.mPositionHandle);
- GLES20.glEnableVertexAttribArray(this.mTexCoordHandle);
- GLES20.glVertexAttribPointer(this.mPositionHandle, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, vertexStride, this.vertexBuffer);
- GLES20.glVertexAttribPointer(this.mTexCoordHandle, 2, GLES20.GL_FLOAT, false, 2*4, this.textureCoordsBuffer);
- GLES20.glUniformMatrix4fv(this.mProjectionMatrixHandle, 1, false, this.projection, 0);
- GLES20.glUniformMatrix4fv(this.mModelMatrixHandle, 1, false, this.model, 0);
- GLES20.glUniform1i(this.mTexHandle, texUnit);
- GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);
- GLES20.glDisableVertexAttribArray(this.mPositionHandle);
- GLES20.glDisableVertexAttribArray(this.mTexCoordHandle);
- }
- public void renderImageTexCoords(int x, int y, int width, int height, float u1, float v1, float u2, float v2, int texUnit){
- float[] texCoords = {
- u1, v1,
- u1, v2,
- u2, v2,
- u1, v1,
- u2, v2,
- u2, v1
- };
- ByteBuffer bb = ByteBuffer.allocateDirect(texCoords.length * 4);
- bb.order(ByteOrder.nativeOrder());
- this.textureCoordsBuffer = bb.asFloatBuffer();
- this.textureCoordsBuffer.put(texCoords);
- this.textureCoordsBuffer.position(0);
- Matrix.setIdentityM(this.model, 0);
- Matrix.translateM(this.model, 0, x, y, 0.0f);
- Matrix.scaleM(this.model, 0, width, height, 1.0f);
- GLES20.glUseProgram(this.mProgram);
- GLES20.glEnableVertexAttribArray(this.mPositionHandle);
- GLES20.glEnableVertexAttribArray(this.mTexCoordHandle);
- GLES20.glVertexAttribPointer(this.mPositionHandle, COORDS_PER_VERTEX, GLES20.GL_FLOAT, false, vertexStride, this.vertexBuffer);
- GLES20.glVertexAttribPointer(this.mTexCoordHandle, 2, GLES20.GL_FLOAT, false, 2*4, this.textureCoordsBuffer);
- GLES20.glUniformMatrix4fv(this.mProjectionMatrixHandle, 1, false, this.projection, 0);
- GLES20.glUniformMatrix4fv(this.mModelMatrixHandle, 1, false, this.model, 0);
- GLES20.glUniform1i(this.mTexHandle, texUnit);
- GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);
- GLES20.glDisableVertexAttribArray(this.mPositionHandle);
- GLES20.glDisableVertexAttribArray(this.mTexCoordHandle);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement