-
Notifications
You must be signed in to change notification settings - Fork 26
/
uishader.go
73 lines (62 loc) · 1.78 KB
/
uishader.go
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
// Copyright 2015 Matthew Collins
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package render
import (
"github.com/thinkofdeath/steven/render/gl"
"github.com/thinkofdeath/steven/render/glsl"
)
type uiShader struct {
Position gl.Attribute `gl:"aPosition"`
TextureInfo gl.Attribute `gl:"aTextureInfo"`
TextureOffset gl.Attribute `gl:"aTextureOffset"`
Color gl.Attribute `gl:"aColor"`
Texture gl.Uniform `gl:"textures"`
ScreenSize gl.Uniform `gl:"screenSize"`
}
func init() {
glsl.Register("ui_vertex", `
in ivec3 aPosition;
in vec4 aTextureInfo;
in ivec3 aTextureOffset;
in vec4 aColor;
out vec4 vColor;
out vec4 vTextureInfo;
out vec2 vTextureOffset;
out float vAtlas;
uniform vec2 screenSize;
void main() {
vec2 pos = aPosition.xy / screenSize;
gl_Position = vec4((pos.x-0.5)*2.0, -(pos.y-0.5)*2.0, float(-aPosition.z) / float(0xFFFF-1), 1.0);
vColor = aColor;
vTextureInfo = aTextureInfo;
vTextureOffset = aTextureOffset.xy / 16.0;
vAtlas = aTextureOffset.z;
}
`)
glsl.Register("ui_frag", `
uniform sampler2DArray textures;
in vec4 vColor;
in vec4 vTextureInfo;
in vec2 vTextureOffset;
in float vAtlas;
out vec4 fragColor;
#include lookup_texture
void main() {
vec4 col = atlasTexture();
col *= vColor;
if (col.a == 0.0) discard;
fragColor = col;
}
`)
}