Anaglyph 3d Video Player For Android Here

Create test videos with known depth patterns:


Would you like a technical architecture outline (decoder → shader → anaglyph composite → renderer), or a UI mockup description for this player?

This feature allows users to watch 3D content using standard, low-cost red-cyan glasses on any Android device without specialized hardware. Core Functionality Anaglyph 3D - AVS Video Editor

AVS4YOU >> AVS Video Editor >> Working with AVS Video Editor >> Editing Videos >> Video Effects >> Special Effects >> Anaglyph 3D. AVS4You

Media player that supports Anaglyph 3D playback? : r/AndroidTV

To watch 3D movies on your Android device using classic red-cyan glasses, you need a specialized video player that can convert Side-by-Side (SBS) or Over/Under 3D files into Anaglyph 3D in real-time. Top Anaglyph 3D Players for Android

Most standard players like VLC or MX Player support 3D on PC, but their Android versions often lack the specific "Anaglyph" filter. To get the best results, use these specialized apps: anaglyph 3d video player for android

UltraPlay 3D/VR: This modern player is specifically designed for mobile 3D. It allows you to switch between normal playback, 3D Anaglyph (Red-Cyan), and full VR SBS modes.

DiME 3D Player: A lightweight option that supports various 3D formats and can easily fix the screen into an anaglyph output for your glasses.

myVideos 3D+: A popular choice for converting 2D videos to 3D on the fly or playing dedicated 3D files in anaglyph mode. How to Set Up Your 3D Experience

Get Your Gear: You must have a pair of Red/Cyan (Anaglyph) glasses. These work on any standard smartphone screen—no special display technology is required.

Source the Video: Download a video in Side-by-Side (SBS) or Over/Under format. These files show two images at once when played in a standard player. Configure the Player: Open your chosen player (e.g., UltraPlay 3D/VR). Tap the 3D icon or navigate to Settings > Viewing Method. Select Anaglyph Red/Cyan.

Watch on YouTube: The YouTube App can also handle anaglyph videos. Search for "3D SBS," open a video, and look for the 3D setting (usually under the settings gear) to select Anaglyph. Pro Tip: Using VLC for Android Create test videos with known depth patterns:

While VLC for Android doesn't natively include the "Anaglyph" filter found in the desktop version, you can watch pre-converted anaglyph videos (where the red/blue tint is already baked into the file) with no extra settings needed.

How to Watch 3D Movies at Home? Discover the Best Way! - GOOVIS


This application requires Anaglyph 3D Glasses to function correctly.


package com.example.anaglyph3d

import android.content.Context import android.graphics.SurfaceTexture import android.opengl.GLES20 import android.opengl.GLSurfaceView import android.opengl.Matrix import javax.microedition.khronos.egl.EGLConfig import javax.microedition.khronos.opengles.GL10

class AnaglyphRenderer(private val context: Context) : GLSurfaceView.Renderer

private var program: Int = -1
private var videoTextureId: Int = -1
private var surfaceTexture: SurfaceTexture? = null
private var videoWidth = 640
private var videoHeight = 480
private var screenWidth = 1
private var screenHeight = 1
private val vertexBuffer = java.nio.ByteBuffer.allocateDirect(4 * 4 * 4).order(java.nio.ByteOrder.nativeOrder()).asFloatBuffer()
private val texCoordBuffer = java.nio.ByteBuffer.allocateDirect(4 * 2 * 4).order(java.nio.ByteOrder.nativeOrder()).asFloatBuffer()
val surfaceTexture: SurfaceTexture
    get() = surfaceTexture!!
fun setVideoSize(width: Int, height: Int) 
    videoWidth = width
    videoHeight = height
override fun onSurfaceCreated(gl: GL10?, config: EGLConfig?) 
    GLES20.glClearColor(0f, 0f, 0f, 1f)
// Vertex shader
    val vertexShaderCode = """
        attribute vec4 vPosition;
        attribute vec2 aTexCoord;
        varying vec2 vTexCoord;
        void main() 
            gl_Position = vPosition;
            vTexCoord = aTexCoord;
""".trimIndent()
// Fragment shader – Anaglyph (Red-Cyan)
    val fragmentShaderCode = """
        precision mediump float;
        varying vec2 vTexCoord;
        uniform sampler2D uTexture;
        void main() 
            vec2 leftTex = vec2(vTexCoord.x * 0.5, vTexCoord.y);
            vec2 rightTex = vec2(vTexCoord.x * 0.5 + 0.5, vTexCoord.y);
vec4 leftColor = texture2D(uTexture, leftTex);
            vec4 rightColor = texture2D(uTexture, rightTex);
// Red channel from left eye, Cyan (Green+Blue) from right eye
            float r = leftColor.r;
            float g = rightColor.g;
            float b = rightColor.b;
gl_FragColor = vec4(r, g, b, 1.0);
""".trimIndent()
program = createProgram(vertexShaderCode, fragmentShaderCode)
    GLES20.glUseProgram(program)
// Full-screen quad vertices (x, y)
    val vertices = floatArrayOf(
        -1f, -1f,
         1f, -1f,
        -1f,  1f,
         1f,  1f
    )
    vertexBuffer.put(vertices).position(0)
// Texture coordinates for side-by-side 3D video
    val texCoords = floatArrayOf(
        0f, 1f,
        1f, 1f,
        0f, 0f,
        1f, 0f
    )
    texCoordBuffer.put(texCoords).position(0)
val positionHandle = GLES20.glGetAttribLocation(program, "vPosition")
    GLES20.glEnableVertexAttribArray(positionHandle)
    GLES20.glVertexAttribPointer(positionHandle, 2, GLES20.GL_FLOAT, false, 8, vertexBuffer)
val texCoordHandle = GLES20.glGetAttribLocation(program, "aTexCoord")
    GLES20.glEnableVertexAttribArray(texCoordHandle)
    GLES20.glVertexAttribPointer(texCoordHandle, 2, GLES20.GL_FLOAT, false, 8, texCoordBuffer)
// Create texture
    val textures = IntArray(1)
    GLES20.glGenTextures(1, textures, 0)
    videoTextureId = textures[0]
    GLES20.glBindTexture(GLES20.GL_TEXTURE_EXTERNAL_OES, videoTextureId)
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR)
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR)
surfaceTexture = SurfaceTexture(videoTextureId)
    surfaceTexture?.setOnFrameAvailableListener 
        glSurfaceView.requestRender()
override fun onSurfaceChanged(gl: GL10?, width: Int, height: Int) 
    screenWidth = width
    screenHeight = height
    GLES20.glViewport(0, 0, width, height)
override fun onDrawFrame(gl: GL10?) 
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT)
    surfaceTexture?.updateTexImage()
GLES20.glUseProgram(program)
    GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, videoTextureId)
val textureHandle = GLES20.glGetUniformLocation(program, "uTexture")
    GLES20.glUniform1i(textureHandle, 0)
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4)
private fun createProgram(vertexSource: String, fragmentSource: String): Int 
    val vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexSource)
    val fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentSource)
    val program = GLES20.glCreateProgram()
    GLES20.glAttachShader(program, vertexShader)
    GLES20.glAttachShader(program, fragmentShader)
    GLES20.glLinkProgram(program)
    return program
private fun loadShader(type: Int, source: String): Int 
    val shader = GLES20.glCreateShader(type)
    GLES20.glShaderSource(shader, source)
    GLES20.glCompileShader(shader)
    return shader


You can easily modify the shader for top-bottom or full-SBS formats.


Rating: 4.0/5 | Price: Free

VRobe is an interesting hybrid. While it is designed for VR Cardboard headsets, it has a dedicated "Anaglyph 3D" mode for standard viewing. Its strength is file management.

This simple method converts both views to grayscale and masks channels.