android - 在OpenGL中将蒙版应用于视频
问题描述
我是 OpenGL 的大一新生。我试图找到解决我的问题的方法。我用 alpha 蒙版录制了一段视频。视频 RGB 的顶部和底部是 alpha。据我了解需要更改我的着色器,但我不明白如何做到这一点。
顶点着色器
private static final String vertexShaderCode =
"attribute vec4 vPosition;" +
"attribute vec4 vTexCoordinate;" +
"uniform mat4 textureTransform;" +
"varying vec2 v_TexCoordinate;" +
"void main() {" +
" v_TexCoordinate = (textureTransform * vTexCoordinate).xy;" +
" gl_Position = vPosition;" +
"}";
片段着色器
private static final String fragmentShaderCode =
"#extension GL_OES_EGL_image_external : require\n" +
"precision mediump float;" +
"uniform samplerExternalOES texture;" +
"varying vec2 v_TexCoordinate;" +
"void main () {" +
" vec4 color = texture2D(texture, v_TexCoordinate);" +
" gl_FragColor = color;" +
"}";
解决方案
要跳过片段,您可以使用discard
片段着色器中的关键字。
您必须对纹理进行 2 次查找。上半部分的第一个用于获取 RGB 颜色通道,下半部分的第二个用于从红色颜色通道获取遮罩:
vec2 c_uv = vec2(texture.x, texture.y*0.5);
vec4 color = texture2D(c_uv, v_TexCoordinate);
vec2 m_uv = vec2(texture.x, 0.5 + texture.y*0.5);
float mask = texture2D(m_uv, v_TexCoordinate).r;
片段着色器可能如下所示:
#extension GL_OES_EGL_image_external : require
precision mediump float;
uniform samplerExternalOES texture;
varying vec2 v_TexCoordinate;
void main () {
vec2 m_uv = vec2(v_TexCoordinate.x, 0.5 + v_TexCoordinate.y*0.5);
float mask = texture2D(texture, m_uv).r;
if ( mask < 0.5 )
discard;
vec2 c_uv = vec2(v_TexCoordinate.x, v_TexCoordinate.y*0.5);
vec4 color = texture2D(texture, c_uv);
gl_FragColor = color;
}
推荐阅读
- javascript - 在 shadow-root 中注入 CSS 样式而不是 head 标签 | Vue.js 和 Webpack
- c# - 在 ASP.NET 中的不同类之间传递值并将它们存储在初始类中
- android - Android从broadcastReceiver向webView发送值
- python - 如何将提及变量转换为普通变量并将其打印到我的终端
- git - 能够将 git 提交作者更改为任何内容的理由是什么?
- python - Discord 重印消息机器人命令
- mongodb - MongoDB 中 $geoNear 查询的时间复杂度
- angular - MSAL ASP.NET Web API 在 Angular HTTP GET 请求上返回 401
- netty - 使用 vertx Web 客户端版本 4.0.0 时出现 java.lang.IllegalAccessError
- sql - Oracle SQL - 根据数量列生成行