Java Android上OpenGL Sphere上的视频纹理绑定

Java Android上OpenGL Sphere上的视频纹理绑定,java,android,video,opengl-es,textures,Java,Android,Video,Opengl Es,Textures,我正在尝试在Android上创建一个360视频球体(就像纸板球一样)。我在OpenGLES1.0中渲染了一个球体,然后在上面附加了一个纹理。之后,我可以使用传感器值旋转球体 但是,我不知道如何将图片更改为视频。我尝试过使用texSubImage2D()逐帧渲染,但速度非常慢。我的视频可能会达到4k密度,因为即使只显示一小部分视频,我也需要高质量的视频 我读过一些关于如何实现这一点的理论资料(即帧缓冲区、外部纹理、同步等),但我找不到任何关于这些方面的示例,因此一些代码将非常受欢迎 下面是我如何渲

我正在尝试在Android上创建一个360视频球体(就像纸板球一样)。我在OpenGLES1.0中渲染了一个球体,然后在上面附加了一个纹理。之后,我可以使用传感器值旋转球体

但是,我不知道如何将图片更改为视频。我尝试过使用texSubImage2D()逐帧渲染,但速度非常慢。我的视频可能会达到4k密度,因为即使只显示一小部分视频,我也需要高质量的视频

我读过一些关于如何实现这一点的理论资料(即帧缓冲区、外部纹理、同步等)
,但我找不到任何关于这些方面的示例,因此一些代码将非常受欢迎

下面是我如何渲染球体、绘制球体并向其附加纹理(即我的球体类)


我有一些这种类型的视频纹理问题。我第一次使用ffmpeg进行视频解码,但性能太差(就像你一样,逐帧提取)。为了提高性能,我使用了android默认mediaplayer。您可以使用表面纹理创建opengl曲面(球体、圆柱体、立方体等),然后在媒体播放器中设置曲面

Surface surface = new Surface(mSurface);//mSurface is your surface texture
mMediaPlayer.setSurface(surface);
mMediaPlayer.setScreenOnWhilePlaying(true);

这只是一种技巧。我做了一些商业封闭的项目,所以我不能分享代码。我希望我能很快在github中发布一个免费代码。

你看到了吗:切换到OpenGLES 2.0并使用带有GL_纹理的外部纹理目标。一个示例项目是@samgak,谢谢。这看起来很有用。虽然我不知道如何从这个“转到3d”。如描述所述,2d视频的深度缓冲区已被禁用。我需要能够平移和旋转视频纹理,但即使我添加并设置了深度缓冲区,它似乎也不起作用……要在3D中渲染,您需要更改顶点着色器代码以应用3D变换,然后将模型视图投影矩阵作为一个统一体传入。举一个例子。不确定为什么深度缓冲区不起作用,但您真的需要一个深度缓冲区来渲染单个球体吗?我认为背面剔除应该足够了。
@Override
public void onDrawFrame(final GL10 gl) {

    zvector = new float[] {0,0,1,0};
    resultvector = new float[] {0,0,1,0};
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    gl.glLoadIdentity();

    float radiansX = (float) Math.toRadians(gyro_angle[1]);
    float radiansY = (float) Math.toRadians(-gyro_angle[0]);
    float radiansZ = (float) Math.toRadians(-gyro_angle[2]);

    // Finds the Sin and Cosin for the half angle.
    float sinX =(float) Math.sin(radiansX * 0.5);
    float cosX =(float) Math.cos(radiansX * 0.5);
    float sinY =(float) Math.sin(radiansY * 0.5);
    float cosY =(float) Math.cos(radiansY * 0.5);
    float sinZ =(float) Math.sin(radiansZ * 0.5);
    float cosZ =(float) Math.cos(radiansZ * 0.5);

    // Formula to construct a new Quaternion based on direction and angle.
    quatX[0] = cosX;
    quatX[1] = 1 * sinX;
    quatX[2] = 0 * sinX;
    quatX[3] = 0 * sinX;
    quatY[0] = cosY;
    quatY[1] = 0 * sinY;
    quatY[2] = 1 * sinY;
    quatY[3] = 0 * sinY;
    quatZ[0] = cosZ;
    quatZ[1] = 0 * sinZ;
    quatZ[2] = 0 * sinZ;
    quatZ[3] = 1 * sinZ;


    quat1 = multiplyQuat(quatX, quatY);
    quat2 = multiplyQuat(quat1, quatZ);

    mMatrix = getMatrixfromQuat(quat1);
    gl.glLoadMatrixf(mMatrix, 0);
    this.mSphere.draw(gl);
}
@Override
public void onSurfaceChanged(final GL10 gl, final int width, final int height) {
    final float aspectRatio = (float) width / (float) (height == 0 ? 1 : height);

    gl.glViewport(0, 0, width, height);
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();
    GLU.gluPerspective(gl, 45.0f, aspectRatio, 0.1f, 100.0f);
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadIdentity();
}
@Override
public void onSurfaceCreated(final GL10 gl, final EGLConfig config) {
    this.mSphere.loadGLTexture(gl, this.mContext, R.drawable.pic360);
    gl.glEnable(GL10.GL_TEXTURE_2D);
    gl.glShadeModel(GL10.GL_SMOOTH);
    gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
    gl.glClearDepthf(1.0f);
    gl.glEnable(GL10.GL_DEPTH_TEST);
    gl.glDepthFunc(GL10.GL_LEQUAL);
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
}

//CONSTRUCTER
public GlRenderer(final Context context) {
    this.mContext = context;
    this.mSphere = new Sphere(5, 2);
    sensorManager = (SensorManager) this.mContext.getSystemService(this.mContext.SENSOR_SERVICE);
    sensorGyroscope = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
    sensorAccelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    sensorMagneticField = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
    valuesAccelerometer = new float[3];
    valuesMagneticField = new float[3];
    matrixR = new float[9];
    matrixI = new float[9];
    matrixValues = new float[3];

    sensorManager.registerListener(this, sensorGyroscope, SensorManager.SENSOR_DELAY_FASTEST);
    sensorManager.registerListener(this, sensorAccelerometer, SensorManager.SENSOR_DELAY_FASTEST);
    sensorManager.registerListener(this, sensorMagneticField, SensorManager.SENSOR_DELAY_FASTEST);
}
//HERE GOES SOME CURRENTLY IRRELEVANT STUFF ABOUT THE SENSORS AND QUATERNIONS
Surface surface = new Surface(mSurface);//mSurface is your surface texture
mMediaPlayer.setSurface(surface);
mMediaPlayer.setScreenOnWhilePlaying(true);