File: RGBMultiLUTLookupCombine_FormattingShader.frag.txt

package info (click to toggle)
psychtoolbox-3 3.0.19.14.dfsg1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 86,796 kB
  • sloc: ansic: 176,245; cpp: 20,103; objc: 5,393; sh: 2,753; python: 1,397; php: 384; makefile: 193; java: 113
file content (47 lines) | stat: -rw-r--r-- 1,900 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/* RGBMultiLUTLookupCombine_FormattingShader.frag.txt
 * 
 * Remaps a RGB color texel from an input image by:
 * 1. Rescaling each color channels input value via a multiplicator.
 * 2. Rounding the rescaled value to an integer lookup index.
 * 3. Looking up a RGBA8 bias value texel from a lookup table. For
 *    each color channel, an individual RGBA bias is looked up
 *    from an individual row of the CLUT texture.
 * 4. Add the per channel biases up (== binary OR of biases) to
 *    form the final merged RGBA8 output pixel.
 *
 * This shader is useful for RGB high precision output devices with
 * a per color channel bit-depth of up to 2^bpc <= maxtexturesize,
 * i.e., constrained by maximum width of a texture:
 * Up to 12 bpc on pre Direct3D-10 style hardware (max = 4096).
 * Up to 13 bpc on Radeon HD2xxx/3xxxx/4xxx and Geforce 8xxx/9xxx hw.
 *
 * The shader is currently used by:
 *
 * - Native 10 bpc framebuffer of ATI Radeon X1000/HD2xxx/.... hardware.
 *   See "PsychHelperCreateARGB2101010RemapCLUT.m" for setup code etc.
 *
 * (w)2008 by Mario Kleiner. Licensed under MIT license.
*/

#extension GL_ARB_texture_rectangle : enable

uniform sampler2DRect   Image;
uniform sampler2DRect   CLUT;
uniform float           Prescale;

void main()
{
    /* Read input RGB pixel values in range 0.0 - 1.0: */
    vec3 incolor = texture2DRect(Image, gl_TexCoord[0].st).rgb;

    /* Remap them to integer index in resolution range: */
    incolor = floor(incolor * Prescale + 0.5) + 0.5;

    /* Lookup biases to apply for channels in rows of texture: */
    vec4 rcomp = texture2DRect(CLUT, vec2(incolor.r, 0.5));
    vec4 gcomp = texture2DRect(CLUT, vec2(incolor.g, 1.5));
    vec4 bcomp = texture2DRect(CLUT, vec2(incolor.b, 2.5));

    /* Combine biases to a single RGBA8 output pixel color: */
    gl_FragColor = rcomp + gcomp + bcomp;
}