GL_REPEAT不适用于视频.mp4但可以用于图像.png



GL_REPEAT 对于使用 GL_TEXTURE_2D 的图像工作正常,但对于使用 GL_TEXTURE_EXTERNAL_OES 的 mp4 则不行。我需要这个来创建无限类型的滚动效果来移动像素并导出更改。

在片段着色器中,无限水平滚动效果可以通过以下方式实现:

uniform float scroll;
void main() {
vec2 coord = vec2(v_TexCoordinate.x + scroll, v_TexCoordinate.y);
gl_FragColor = texture2D(u_Texture, coord);
}

在我的 GlSurface 中,我的几何形状和初始 gl 设置定义如下:

private static final float squareVertices[] = {
-1.0f, 1.0f,    // top left
-1.0f, -1.0f,   // bottom left
1.0f, -1.0f,    // bottom right
1.0f, 1.0f      // top right
};
private static final float textureVertices[] = {                // in counterclockwise order:
0.0f, 0.0f,
1.0f, 0.0f,
1.0f, 1.0f,
0.0f, 1.0f
};
private void glSetup() {
final String vertexShader = Utils.readTextFileFromRawResource(mMainActivity,
R.raw.media_vertex_shader);
String fragmentShader = null;
if (isVideo) {
fragmentShader = Utils.readTextFileFromRawResource(mMainActivity,
R.raw.media_fragment_shader_video);
} else {
fragmentShader = Utils.readTextFileFromRawResource(mMainActivity,
R.raw.media_fragment_shader_image);
}
final int vertexShaderHandle = ShaderHelper.compileShader(GLES20.GL_VERTEX_SHADER,
vertexShader);
final int fragmentShaderHandle = ShaderHelper.compileShader(GLES20.GL_FRAGMENT_SHADER,
fragmentShader);
int[] textures = new int[1];
GLES20.glGenTextures(1, textures, 0);
mTextureId = textures[0];
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glUniform1i(mTextureUniformHandle, 0);
if (isVideo) {
GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, mTextureId);
GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MAG_FILTER,
GLES20.GL_LINEAR);
GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MIN_FILTER,
GLES20.GL_LINEAR);
GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_S,
GLES20.GL_REPEAT);
GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_T,
GLES20.GL_REPEAT);
mSurfaceTexture = new SurfaceTexture(mTextureId);
mMediaPlayer.setSurface(mSurfaceTexture);
mSurfaceTexture.setOnFrameAvailableListener(this);
} else {                        //image
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureId);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER,
GLES20.GL_LINEAR);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER,
GLES20.GL_LINEAR);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S,
GLES20.GL_REPEAT);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T,
GLES20.GL_REPEAT);
}
mScrollHandle = GLES20.glGetUniformLocation(mProgramHandle, "scroll");
Matrix.setIdentityM(mSTMatrix, 0);
}

和 onDrawFame((:

@Override
public void onDrawFrame(GL10 gl) {
if (isVideo) {
GLES20.glUniformMatrix4fv(muSTMatrixHandle, 1, false, mSTMatrix, 0);
GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, mTextureId);
GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MAG_FILTER,
GLES20.GL_LINEAR);
GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MIN_FILTER,
GLES20.GL_LINEAR);
GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_S,
GLES20.GL_REPEAT);
GLES20.glTexParameteri(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_T,
GLES20.GL_REPEAT);
Log.d(TAG, GLES20.glGetError());
} else {
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureId);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureId);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER,
GLES20.GL_LINEAR);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER,
GLES20.GL_LINEAR);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S,
GLES20.GL_REPEAT);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T,
GLES20.GL_REPEAT);
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, mImage, 0);
}
}
@Override  //only called for video
synchronized public void onFrameAvailable(SurfaceTexture surface) {
mSurfaceTexture.updateTexImage();
mSurfaceTexture.getTransformMatrix(stMatrix);;
}

我在登录 GLES20.glGetError(( 时看到GL_INVALID_ENUM

我尝试过做什么:

  1. 使用 ffmpeg 到 POT 调整视频大小(2 的幂,2048 x 1024(
  2. 使用 GLES30/GLES31/GLES32 进行所有绑定、参数等调用
  3. 将纹理顶点和方形顶点更改为> 1.0f
  4. 使用 GL31.glGetTexLevelParameteriv(( 打印纹理的宽度/高度,该值为视频的宽度和高度打印出 0,但为图像打印出适当的尺寸

不确定GL_Repeat是否应该在 mp4 文件的目标GL_Texture_External_OES上工作。听起来它应该是可重复的,根据OpenGl笔记部分。

欢迎任何其他建议尝试!

不支持。请参阅规范"问题 2":

https://www.khronos.org/registry/OpenGL/extensions/OES/OES_EGL_image_external.txt

具体说来:

  1. 外部纹理的包装模式是否应该允许为CLAMP_TO_EDGE以外的任何模式?

    RESOLVED: no
    

相关内容

最新更新