Add shader loading functionality
[no changelog]
This commit is contained in:
@@ -0,0 +1,18 @@
|
||||
#version 150
|
||||
|
||||
#moj_import <fog.glsl>
|
||||
|
||||
uniform vec4 ColorModulator;
|
||||
uniform float FogStart;
|
||||
uniform float FogEnd;
|
||||
uniform vec4 FogColor;
|
||||
|
||||
in float vertexDistance;
|
||||
in vec4 vertexColor;
|
||||
|
||||
out vec4 fragColor;
|
||||
|
||||
void main() {
|
||||
vec4 color = vertexColor * ColorModulator;
|
||||
fragColor = linear_fog(color, vertexDistance, FogStart, FogEnd, FogColor);
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"vertex": "firmament_rendertype_lines",
|
||||
"fragment": "firmament_rendertype_lines",
|
||||
"samplers": [
|
||||
],
|
||||
"uniforms": [
|
||||
{ "name": "ModelViewMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] },
|
||||
{ "name": "ProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] },
|
||||
{ "name": "ColorModulator", "type": "float", "count": 4, "values": [ 1.0, 1.0, 1.0, 1.0 ] },
|
||||
{ "name": "LineWidth", "type": "float", "count": 1, "values": [ 1.0 ] },
|
||||
{ "name": "ScreenSize", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] },
|
||||
{ "name": "FogStart", "type": "float", "count": 1, "values": [ 0.0 ] },
|
||||
{ "name": "FogEnd", "type": "float", "count": 1, "values": [ 1.0 ] },
|
||||
{ "name": "FogColor", "type": "float", "count": 4, "values": [ 0.0, 0.0, 0.0, 0.0 ] },
|
||||
{ "name": "FogShape", "type": "int", "count": 1, "values": [ 0 ] }
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
#version 150
|
||||
|
||||
#moj_import <fog.glsl>
|
||||
|
||||
in vec3 Position;
|
||||
in vec4 Color;
|
||||
in vec3 Normal;
|
||||
|
||||
uniform mat4 ModelViewMat;
|
||||
uniform mat4 ProjMat;
|
||||
uniform float LineWidth;
|
||||
uniform vec2 ScreenSize;
|
||||
uniform int FogShape;
|
||||
|
||||
out float vertexDistance;
|
||||
out vec4 vertexColor;
|
||||
|
||||
const float VIEW_SHRINK = 1.0 - (1.0 / 256.0);
|
||||
const mat4 VIEW_SCALE = mat4(
|
||||
VIEW_SHRINK, 0.0, 0.0, 0.0,
|
||||
0.0, VIEW_SHRINK, 0.0, 0.0,
|
||||
0.0, 0.0, VIEW_SHRINK, 0.0,
|
||||
0.0, 0.0, 0.0, 1.0
|
||||
);
|
||||
|
||||
void main() {
|
||||
vec4 linePosStart = ProjMat * VIEW_SCALE * ModelViewMat * vec4(Position, 1.0);
|
||||
vec4 linePosEnd = ProjMat * VIEW_SCALE * ModelViewMat * vec4(Position + Normal, 1.0);
|
||||
|
||||
vec3 ndc1 = linePosStart.xyz / linePosStart.w;
|
||||
vec3 ndc2 = linePosEnd.xyz / linePosEnd.w;
|
||||
|
||||
bool linePosStartBehind = ndc1.z <= -1;
|
||||
bool linePosEndBehind = ndc2.z <= -1;
|
||||
|
||||
if ((linePosStartBehind && linePosEndBehind)) {
|
||||
gl_Position = vec4(-2.0, -2.0, -2.0, 1.0);
|
||||
return; // I don't care for these people
|
||||
}
|
||||
if (linePosStartBehind || linePosEndBehind) {
|
||||
ndc1.z = 0.0;
|
||||
ndc2.z = 0.0;
|
||||
linePosStart.w = 1.0;
|
||||
// TODO: use mx + b to find move the two coordinates around to extend lines
|
||||
}
|
||||
|
||||
vec2 lineScreenDirection = normalize((ndc2.xy - ndc1.xy) * ScreenSize);
|
||||
vec2 lineOffset = vec2(-lineScreenDirection.y, lineScreenDirection.x) * LineWidth / ScreenSize;
|
||||
|
||||
if (lineOffset.x < 0.0) {
|
||||
lineOffset *= -1.0;
|
||||
}
|
||||
|
||||
if (gl_VertexID % 2 == 0) {
|
||||
gl_Position = vec4((ndc1 + vec3(lineOffset, 0.0)) * linePosStart.w, linePosStart.w);
|
||||
} else {
|
||||
gl_Position = vec4((ndc1 - vec3(lineOffset, 0.0)) * linePosStart.w, linePosStart.w);
|
||||
}
|
||||
|
||||
vertexDistance = fog_distance(Position, FogShape);
|
||||
vertexColor = Color;
|
||||
}
|
||||
Reference in New Issue
Block a user