Home›Java›Shaders›Image Shader
Image Shader
ShadersJava

Image Shader

Java shader pack listed for Minecraft 1.16–1.21. Downloads from the MC Java Mods app on Android.

by lanzhan5656 · on Modrinth

⬇ Download on Modrinth
Image Shader — screenshot 1Image Shader — screenshot 2Image Shader — screenshot 3Image Shader — screenshot 4Image Shader — screenshot 5Image Shader — screenshot 6

Image Shader

Only use a shader to display an image on your screen~
Note: compiling the shader may take some time!

A Minecraft Screenshot

How to prepare a custom image~

First, use ffmpeg (or any tool) to resize your image to 160×160 pixels.

Using ffmpeg:
ffmpeg -i Input.png -vf scale=160:160 image.png

Then place the resized image in the same directory as the Python script below.
Run the script to produce an image_chunks folder, then copy the 16 .glsl files inside into shaders/data/image_chunks (you need to unpack the shader pack first).
Enter the game, enable the custom image option in the shader settings, and wait for the shader to finish compiling — Then it's ok~

A Python Script
from PIL import Image
import os

def generate_glsl_chunks(image_path, output_dir="image_chunks"):
    try:
        img = Image.open(image_path).convert('RGBA')
    except FileNotFoundError:
        print(f"Error: Image file not found at {image_path}")
        return

    width, height = img.size
    if width != 160 or height != 160:
        print(f"Error: Image must be 160x160 pixels, but it is {width}x{height}.")
        print(f"You can use:")
        print(f"ffmpeg -i image.png -vf scale=160:160 output.png")
        print(f"to adjust the image resolution.")
        return
        
    os.makedirs(output_dir, exist_ok=True)
    chunk_size = 40
    num_chunks_x = width // chunk_size
    num_chunks_y = height // chunk_size

    for chunk_y in range(num_chunks_y):
        for chunk_x in range(num_chunks_x):
            left = chunk_x * chunk_size
            upper = chunk_y * chunk_size
            right = left + chunk_size
            lower = upper + chunk_size
            sub_img = img.crop((left, upper, right, lower))
            pixel_data = list(sub_img.getdata())

            array_name = f"image_data_{chunk_y}_{chunk_x}"
            output_file_path = os.path.join(output_dir, f"{array_name}.glsl")

            glsl_array = f"vec4 {array_name}[{chunk_size * chunk_size}] = vec4[{chunk_size * chunk_size}](\n"
            
            for i, pixel in enumerate(pixel_data):
                r, g, b, a = pixel
                glsl_array += f"    vec4({r/255.0}, {g/255.0}, {b/255.0}, {a/255.0})"
                if i < len(pixel_data) - 1:
                    glsl_array += ","
                if (i + 1) % 4 == 0:
                    glsl_array += "\n"
            
            glsl_array += ");\n"

            with open(output_file_path, 'w') as f:
                f.write(glsl_array)
            
            print(f"Generated file: {output_file_path}")

# --- Config ---
image_file = "image.png"
output_directory = "image_chunks"

generate_glsl_chunks(image_file, output_directory)
Quick facts

Install steps are the general flow for this file type — see the MC Java Mods guides for the full walkthrough.

File checked by MCModsHub

These come from our own check of the pack file, not from the source page.

Explore more