[OpenGL]从零开始写一个Android平台下的全景视频播放器——目录

Github项目地址为了方便没有准备好梯子的同学,我把项目在CSDN上打包下载,不过不会继续更新(保留在初始版本)先放一张效果图: Youtube 优酷前言Android平台下的全景视频(360,Panorama video)播放器是去年年底留的坑,那个时候对于OpenGL ES了解有限,而且现有的开源代码也不多(那个时候UtoVR SDK也还没发布),现有的解决方案像
摘要由CSDN通过智能技术生成

Github项目地址

为了方便没有准备好梯子的同学,我把项目在CSDN上打包下载,不过不会继续更新(保留在初始版本)

先放一张效果图:
播放界面

Youtube
优酷

前言

Android平台下的全景视频(360,Panorama video)播放器是去年年底留的坑,那个时候对于OpenGL ES了解有限,而且现有的开源代码也不多(那个时候UtoVR SDK也还没发布),现有的解决方案像PanoramaGL,Panframe之类的都不能满足要求(Panframe居然连个缩放都没有!!)

  • 10
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 33
    评论
好的,我理解了你的问题,以下是 OpenGL ES 纹理从上到下循环流动的 Android demo: 1. 首先,我们需要在 Android Studio 中创建一个新项目。 2. 在项目中创建一个名为“texture.glsl”的文件,并在其中添加以下代码: vertexShaderCode: ```glsl attribute vec4 position; attribute vec2 textureCoordinate; varying vec2 vTextureCoord; void main() { gl_Position = position; vTextureCoord = textureCoordinate; } ``` fragmentShaderCode: ```glsl precision mediump float; uniform sampler2D uTexture; varying vec2 vTextureCoord; uniform float uTime; void main() { vec2 uv = vec2(vTextureCoord.x, vTextureCoord.y + uTime); if (uv.y > 1.0) { uv.y -= 1.0; } vec4 textureColor = texture2D(uTexture, uv); gl_FragColor = textureColor; } ``` 3. 接下来,在项目中创建一个名为“TextureRenderer.java”的类,并在其中添加以下代码: ```java import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.opengl.GLES20; import android.opengl.GLSurfaceView; import android.opengl.GLUtils; import android.os.SystemClock; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; public class TextureRenderer implements GLSurfaceView.Renderer { private Context context; private int textureId; private int program; private int positionHandle; private int textureCoordinateHandle; private int uTextureHandle; private int uTimeHandle; private float[] vertices = { -1f, -1f, 1f, -1f, -1f, 1f, 1f, 1f }; private float[] textureCoords = { 0f, 1f, 1f, 1f, 0f, 0f, 1f, 0f }; private Bitmap bitmap; public TextureRenderer(Context context) { this.context = context; } @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { gl.glClearColor(0f, 0f, 0f, 1f); createProgram(); createTexture(); } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { GLES20.glViewport(0, 0, width, height); } @Override public void onDrawFrame(GL10 gl) { GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); GLES20.glUseProgram(program); long time = SystemClock.uptimeMillis(); float seconds = time / 1000f; float timeValue = seconds % 1.0f; GLES20.glUniform1f(uTimeHandle, timeValue); GLES20.glActiveTexture(GLES20.GL_TEXTURE0); GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId); GLES20.glUniform1i(uTextureHandle, 0); GLES20.glVertexAttribPointer( positionHandle, 2, GLES20.GL_FLOAT, false, 0, VertexArrayHelper.createFloatBuffer(vertices) ); GLES20.glEnableVertexAttribArray(positionHandle); GLES20.glVertexAttribPointer( textureCoordinateHandle, 2, GLES20.GL_FLOAT, false, 0, VertexArrayHelper.createFloatBuffer(textureCoords) ); GLES20.glEnableVertexAttribArray(textureCoordinateHandle); GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); GLES20.glDisableVertexAttribArray(positionHandle); GLES20.glDisableVertexAttribArray(textureCoordinateHandle); } private void createProgram() { String vertexShaderCode = AssetsHelper.loadShaderCode(context, "texture.glsl", "vertexShaderCode"); String fragmentShaderCode = AssetsHelper.loadShaderCode(context, "texture.glsl", "fragmentShaderCode"); program = GLES20.glCreateProgram(); int vertexShader = GLES20.glCreateShader(GLES20.GL_VERTEX_SHADER); GLES20.glShaderSource(vertexShader, vertexShaderCode); GLES20.glCompileShader(vertexShader); GLES20.glAttachShader(program, vertexShader); int fragmentShader = GLES20.glCreateShader(GLES20.GL_FRAGMENT_SHADER); GLES20.glShaderSource(fragmentShader, fragmentShaderCode); GLES20.glCompileShader(fragmentShader); GLES20.glAttachShader(program, fragmentShader); GLES20.glLinkProgram(program); positionHandle = GLES20.glGetAttribLocation(program, "position"); textureCoordinateHandle = GLES20.glGetAttribLocation(program, "textureCoordinate"); uTextureHandle = GLES20.glGetUniformLocation(program, "uTexture"); uTimeHandle = GLES20.glGetUniformLocation(program, "uTime"); } private void createTexture() { bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.texture); int[] textureIds = new int[1]; GLES20.glGenTextures(1, textureIds, 0); textureId = textureIds[0]; GLES20.glActiveTexture(GLES20.GL_TEXTURE0); GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST); 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, bitmap, 0); bitmap.recycle(); } } ``` 4. 最后,在 MainActivity 中,添加以下代码: ```java public class MainActivity extends AppCompatActivity { private GLSurfaceView glSurfaceView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); glSurfaceView = findViewById(R.id.gl_surface_view); glSurfaceView.setEGLContextClientVersion(2); glSurfaceView.setRenderer(new TextureRenderer(this)); glSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY); } } ``` 5. 运行应用程序,您将看到纹理从上到下循环流动的效果。 希望这个demo能够帮到你。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值