【发布时间】:2018-01-15 19:29:37
【问题描述】:
这是我目前用于渲染视频的GLVideoRenderer 的onDrawFrame() 代码:
private void drawActual(boolean useFilter) {
Log.i("current_pos", currentFilterPosition+" "+Constant.ILLUSION);
/*
if(currentFilterPosition != Constant.ILLUSION) {
GLES20.glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
} else {
GLES20.glClearColor(0.0f, 1.0f, 0.0f, 0.0f);
GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
}
*/
if(currentFilterPosition != storedFilterPosition)
{
/*Changing fragment shader and resetting the uniform locations*/
storedFilterPosition = currentFilterPosition;
}
Log.e("use_filter", "true");
GLES20.glUseProgram(mProgram);
checkGlError("glUseProgram");
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, mTextureID);
checkGlError("glBindTexture");
Log.i("current_float_timestamp", muTimestampFloatHandle+"");
onPreDrawFrame();
checkGlError("onPreDrawFrame");
mTriangleVertices.position(TRIANGLE_VERTICES_DATA_POS_OFFSET);
GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false,
TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices);
checkGlError("glVertexAttribPointer maPosition");
GLES20.glEnableVertexAttribArray(maPositionHandle);
checkGlError("glEnableVertexAttribArray maPositionHandle");
mTriangleVertices.position(TRIANGLE_VERTICES_DATA_UV_OFFSET);
GLES20.glVertexAttribPointer(maTextureHandle, 3, GLES20.GL_FLOAT, false,
TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices);
checkGlError("glVertexAttribPointer maTextureHandle");
GLES20.glEnableVertexAttribArray(maTextureHandle);
checkGlError("glEnableVertexAttribArray maTextureHandle");
Matrix.setIdentityM(mMVPMatrix, 0);
GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, mMVPMatrix, 0);
checkGlError("glmuMVPMatrixHandleSetting");
GLES20.glUniformMatrix4fv(muSTMatrixHandle, 1, false, mSTMatrix, 0);
checkGlError("glmuSTMatrixHandleSetting");
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
checkGlError("glDrawArrays");
//GLES20.glFinish();
}
这是我用来尝试半透明渲染视频帧的片段着色器:
#extension GL_OES_EGL_image_external : require
precision mediump float;
uniform samplerExternalOES u_Texture;
varying highp vec2 v_TexCoordinate;
uniform float uParamValue1; //filter strength
void main()
{
vec4 texel = texture2D(u_Texture, v_TexCoordinate).rgba;
texel.a *= 0.2;
/*
if(texel.a > 0.5)
discard;
*/
gl_FragColor += texel;
}
我的问题是我的视频帧中的 alpha 值必须全部为 255 或 1.0,因为在片段着色器中使用注释掉的代码进行深度测试时,它要么全部存在,要么全部消失。更糟糕的是,当我使用此代码时,alpha 减少没有效果 - 渲染器只渲染 RGB 组件。
我对片段着色器的期望实际上是应用一些运动模糊效果,所以我希望着色器半透明地渲染视频帧,删除清除功能以防止渲染器清除之前的帧。
我该怎么做,我的代码是否遗漏了什么?
【问题讨论】: