I thought it would be interesting to create a .blend that filters any regular video or image with vintage television look.

Edit: Although this question initially arose from my desire to create a vintage look, it has since been pointed out in a comment that all displays use arrays of RGB emitters, so it's not really an issue of vintage or not. How vintage it will end up looking is probably more a matter of the shape, size, and density of the emitters.

Reference images:

Trinitron screen close-up RGB overlap Varying brightness Face displayed on an LCD screen

Upon examining the structure of screens, the most common seems to be rows of vertical RGB bars:

LCD screen structure closeup

Here is another type which I believe is common in computer displays - circular dots in a hexagonal grid:

Hexagonal grid of circular dots

I have been thinking about how to make a screen in Blender that takes its input from an image or image sequence and for each frame converts the RGB value for a pixel (or region) and uses that to illuminate the red green and blue phosphors in the correct ratios so that when viewed from a distance an image is distinguishable.

Do you think this will require python scripting? I made some initial attempts modeling an array of phosphors then using a Light Path node and a Separate RGB node in Cycles but I haven't gotten very far. I would love to hear what you all can suggest.


  • 2
    $\begingroup$ Related: blender.stackexchange.com/q/3491/599 $\endgroup$
    – gandalf3
    Oct 4, 2015 at 5:58
  • $\begingroup$ @gandalf3 Excellent link! Very much related. Thanks! $\endgroup$
    – Mentalist
    Oct 4, 2015 at 9:01
  • 9
    $\begingroup$ I'm too old when LCD is already called retro ... $\endgroup$ Oct 4, 2015 at 12:19
  • 2
    $\begingroup$ Actually these images are not from LCD, but from older color CRT screens — e.g., the first image is from the Trinitron Wikipedia page, and the last one is from an older delta-gun shadow mask color CRT. $\endgroup$ Oct 4, 2015 at 14:58
  • 1
    $\begingroup$ There is nothing vintage about this though... all monitors work with arrays of emitters of RGB pixels... $\endgroup$
    – user1853
    Oct 4, 2015 at 17:25

2 Answers 2


Create an object that has the basic shape of your pixels and assign 3 materials to it using emission shaders. I named the materials for clarity:

enter image description here

enter image description here

For each of the materials use the same image texture and a separate RGB node to control the brightness of an emission shader, change the color of the emitter to mach that of each channel. Here's the setup for the red material for example:

enter image description here

Note that I'm using an empty to control the texture coordinates.

Then by creating arrays of your base object, and controlling the size and placement of your texture (using the empty) you can easily get the effect you are after:

enter image description here

  • 11
    $\begingroup$ You nailed it! That's a simpler and more elegant solution than I was expecting. Thank you cegaton! $\endgroup$
    – Mentalist
    Oct 4, 2015 at 8:51
  • $\begingroup$ WOW!!! :O. Nery nice. $\endgroup$
    – Paul Gonet
    Oct 4, 2015 at 12:25
  • $\begingroup$ Yeah that's pretty cool $\endgroup$ Oct 5, 2015 at 9:46

As an alternative for @cegaton's answer, here is a purely node-based alternative, trading only supporting stripe-pixels for the ability to be applied to any UV mapped surface:

node graph

The second value of the "multiply" node on the top left is the amount of horizontal "pixels".

example output 1 example output 2

This works by transforming the horizontal texture coordinate to determine its position within a single pixel, and constructing the color for that point based on the color ramps, which are used as ranges. Basically:

  • if x < 1/3, red
  • if 1/3 < x < 2/3, green
  • if x > 2/3, blue

Finally, multiply that color componentwise with the actual texture color, pack into a RGB and feed into Emission.

  • 1
    $\begingroup$ Simply brilliant! Love it. How do the three nodes in the upper left area work? I would guess Separate X moves the coordinates along the image's X axis... But why Multiply 100 and Modulo 1? $\endgroup$
    – Mentalist
    Oct 5, 2015 at 6:38
  • 4
    $\begingroup$ Separate XYZ just splits the three components of the vector (in this case, the UV vector), since we only need to operate the horizontal axis. Since UV coordinates' range is [0; 1], I use Multiply to map it to the range [0; 100]. The number 100 is the amount of horizontal pixels. The Modulo 1 just makes the output of Multiply wrap around the range. Together, Multiply and Modulo just makes the value loop 100 times in the range [0;1] throughout the UV. This is fed into the ColorRamps to give a color output to each sample. Example visualization: gyazo.com/185adb745fc3480c1c89fd8032388cda $\endgroup$
    – Kroltan
    Oct 5, 2015 at 11:14

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .