File: alpha.glsl

package info (click to toggle)
openmw 0.47.0-3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 23,276 kB
  • sloc: cpp: 249,935; xml: 1,978; sh: 1,327; python: 63; makefile: 26
file content (85 lines) | stat: -rw-r--r-- 2,926 bytes parent folder | download | duplicates (2)
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85

#define FUNC_NEVER                          512 // 0x0200
#define FUNC_LESS                           513 // 0x0201
#define FUNC_EQUAL                          514 // 0x0202
#define FUNC_LEQUAL                         515 // 0x0203
#define FUNC_GREATER                        516 // 0x0204
#define FUNC_NOTEQUAL                       517 // 0x0205
#define FUNC_GEQUAL                         518 // 0x0206
#define FUNC_ALWAYS                         519 // 0x0207

#if @alphaFunc != FUNC_ALWAYS && @alphaFunc != FUNC_NEVER
uniform float alphaRef;
#endif

float mipmapLevel(vec2 scaleduv)
{
    vec2 dUVdx = dFdx(scaleduv);
    vec2 dUVdy = dFdy(scaleduv);
    float maxDUVSquared = max(dot(dUVdx, dUVdx), dot(dUVdy, dUVdy));
    return max(0.0, 0.5 * log2(maxDUVSquared));
}

float coveragePreservingAlphaScale(sampler2D diffuseMap, vec2 uv)
{
    #if @adjustCoverage
        vec2 textureSize;
        #if @useGPUShader4
            textureSize = textureSize2D(diffuseMap, 0);
        #else
            textureSize = vec2(256.0);
        #endif
            return 1.0 + mipmapLevel(uv * textureSize) * 0.25;
    #else
        return 1.0;
    #endif
}

void alphaTest()
{
    #if @alphaToCoverage 
        float coverageAlpha = (gl_FragData[0].a - clamp(alphaRef, 0.0001, 0.9999)) / max(fwidth(gl_FragData[0].a), 0.0001) + 0.5;

        // Some functions don't make sense with A2C or are a pain to think about and no meshes use them anyway
        // Use regular alpha testing in such cases until someone complains.
        #if @alphaFunc == FUNC_NEVER
            discard;
        #elif @alphaFunc == FUNC_LESS
            gl_FragData[0].a = 1.0 - coverageAlpha;
        #elif @alphaFunc == FUNC_EQUAL
            if (gl_FragData[0].a != alphaRef)
                discard;
        #elif @alphaFunc == FUNC_LEQUAL
            gl_FragData[0].a = 1.0 - coverageAlpha;
        #elif @alphaFunc == FUNC_GREATER
            gl_FragData[0].a = coverageAlpha;
        #elif @alphaFunc == FUNC_NOTEQUAL
            if (gl_FragData[0].a == alphaRef)
                discard;
        #elif @alphaFunc == FUNC_GEQUAL
            gl_FragData[0].a = coverageAlpha;
        #endif
    #else
        #if @alphaFunc == FUNC_NEVER
            discard;
        #elif @alphaFunc == FUNC_LESS
            if (gl_FragData[0].a >= alphaRef)
                discard;
        #elif @alphaFunc == FUNC_EQUAL
            if (gl_FragData[0].a != alphaRef)
                discard;
        #elif @alphaFunc == FUNC_LEQUAL
            if (gl_FragData[0].a > alphaRef)
                discard;
        #elif @alphaFunc == FUNC_GREATER
            if (gl_FragData[0].a <= alphaRef)
                discard;
        #elif @alphaFunc == FUNC_NOTEQUAL
            if (gl_FragData[0].a == alphaRef)
                discard;
        #elif @alphaFunc == FUNC_GEQUAL
            if (gl_FragData[0].a < alphaRef)
                discard;
        #endif
    #endif
}