Skip to content
Snippets Groups Projects
Commit 6080e3d7 authored by Leo Ma's avatar Leo Ma
Browse files

Simplify gpuimage shader loading approach


Signed-off-by: default avatarLeo Ma <begeekmyfriend@gmail.com>
parent 0f9e5f05
No related branches found
No related tags found
No related merge requests found
Loading
Loading
@@ -49,11 +49,6 @@ public class GPUImageFilter {
private int mGLTextureCoordinateIndex;
private int mGLTextureTransformIndex;
 
private int mGLScreenProgId;
private int mGLScreenPositionIndex;
private int mGLScreenInputImageTextureIndex;
private int mGLScreenTextureCoordinateIndex;
protected int mInputWidth;
protected int mInputHeight;
protected int mOutputWidth;
Loading
Loading
@@ -74,11 +69,11 @@ public class GPUImageFilter {
}
 
public GPUImageFilter(MagicFilterType type) {
this(type, R.raw.vertex_oes, R.raw.fragment_oes);
this(type, R.raw.vertex, R.raw.fragment);
}
 
public GPUImageFilter(MagicFilterType type, int fragmentShaderId) {
this(type, R.raw.vertex_oes, fragmentShaderId);
this(type, R.raw.vertex, fragmentShaderId);
}
 
public GPUImageFilter(MagicFilterType type, int vertexShaderId, int fragmentShaderId) {
Loading
Loading
@@ -106,8 +101,7 @@ public class GPUImageFilter {
 
protected void onInit() {
initVbo();
loadExternalSamplerShader();
loadInternalSamplerShader();
loadSamplerShader();
}
 
protected void onInitialized() {
Loading
Loading
@@ -119,7 +113,6 @@ public class GPUImageFilter {
destroyFboTexture();
destoryVbo();
GLES20.glDeleteProgram(mGLProgId);
GLES20.glDeleteProgram(mGLScreenProgId);
onDestroy();
}
 
Loading
Loading
@@ -137,7 +130,7 @@ public class GPUImageFilter {
mOutputHeight = height;
}
 
private void loadExternalSamplerShader() {
private void loadSamplerShader() {
mGLProgId = OpenGLUtils.loadProgram(OpenGLUtils.readShaderFromRawResource(getContext(), mVertexShaderId),
OpenGLUtils.readShaderFromRawResource(getContext(), mFragmentShaderId));
mGLPositionIndex = GLES20.glGetAttribLocation(mGLProgId, "position");
Loading
Loading
@@ -146,14 +139,6 @@ public class GPUImageFilter {
mGLInputImageTextureIndex = GLES20.glGetUniformLocation(mGLProgId, "inputImageTexture");
}
 
private void loadInternalSamplerShader() {
mGLScreenProgId = OpenGLUtils.loadProgram(OpenGLUtils.readShaderFromRawResource(getContext(), R.raw.vertex_default),
OpenGLUtils.readShaderFromRawResource(getContext(), R.raw.fragment_default));
mGLScreenPositionIndex = GLES20.glGetAttribLocation(mGLScreenProgId, "position");
mGLScreenTextureCoordinateIndex = GLES20.glGetAttribLocation(mGLScreenProgId,"inputTextureCoordinate");
mGLScreenInputImageTextureIndex = GLES20.glGetUniformLocation(mGLScreenProgId, "inputImageTexture");
}
private void initVbo() {
mGLCubeId = new int[1];
mGLTextureCoordinateId = new int[1];
Loading
Loading
@@ -245,11 +230,6 @@ public class GPUImageFilter {
}
 
public int onDrawFrame(int cameraTextureId) {
int fboTexId = DrawToFboTexture(cameraTextureId);
return DrawToScreen(fboTexId);
}
private int DrawToFboTexture(int textureId) {
if (!mIsInitialized) {
return OpenGLUtils.NOT_INIT;
}
Loading
Loading
@@ -272,7 +252,7 @@ public class GPUImageFilter {
GLES20.glUniformMatrix4fv(mGLTextureTransformIndex, 1, false, mGLTextureTransformMatrix, 0);
 
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, textureId);
GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, cameraTextureId);
GLES20.glUniform1i(mGLInputImageTextureIndex, 0);
 
onDrawArraysPre();
Loading
Loading
@@ -284,6 +264,8 @@ public class GPUImageFilter {
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
GLES20.glViewport(0, 0, mOutputWidth, mOutputHeight);
 
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
onDrawArraysAfter();
 
GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, 0);
Loading
Loading
@@ -296,41 +278,6 @@ public class GPUImageFilter {
return mGLFboTexId[0];
}
 
private int DrawToScreen(int textureId) {
if (!mIsInitialized) {
return OpenGLUtils.NOT_INIT;
}
if (mGLFboId == null) {
return OpenGLUtils.NO_TEXTURE;
}
GLES20.glUseProgram(mGLScreenProgId);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, mGLCubeId[0]);
GLES20.glEnableVertexAttribArray(mGLScreenPositionIndex);
GLES20.glVertexAttribPointer(mGLScreenPositionIndex, 2, GLES20.GL_FLOAT, false, 4 * 2, 0);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, mGLTextureCoordinateId[0]);
GLES20.glEnableVertexAttribArray(mGLScreenTextureCoordinateIndex);
GLES20.glVertexAttribPointer(mGLScreenTextureCoordinateIndex, 2, GLES20.GL_FLOAT, false, 4 * 2, 0);
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId);
GLES20.glUniform1i(mGLScreenInputImageTextureIndex, 0);
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0);
GLES20.glDisableVertexAttribArray(mGLScreenPositionIndex);
GLES20.glDisableVertexAttribArray(mGLScreenTextureCoordinateIndex);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
return OpenGLUtils.ON_DRAWN;
}
protected void onDrawArraysPre() {}
 
protected void onDrawArraysAfter() {}
Loading
Loading
precision mediump float;
varying mediump vec2 textureCoordinate;
uniform sampler2D inputImageTexture;
void main() {
gl_FragColor = texture2D(inputImageTexture, textureCoordinate);
}
attribute vec4 position;
attribute vec4 inputTextureCoordinate;
varying vec2 textureCoordinate;
void main() {
textureCoordinate = inputTextureCoordinate.xy;
gl_Position = position;
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment