Optimized shader code

This commit is contained in:
Natty 2022-04-29 23:57:19 +02:00
parent 61ce682270
commit c580104d81
No known key found for this signature in database
GPG Key ID: 40AB22FA416C7019
8 changed files with 148 additions and 40 deletions

View File

@ -3,6 +3,10 @@
in vec2 uvCoordinates; in vec2 uvCoordinates;
in vec2 paintUVCoordinates; in vec2 paintUVCoordinates;
flat in float paintGradientAngleCos;
flat in float paintGradientAngleSin;
flat in float[2] paintGradientEndsUnrotated;
uniform sampler2DRect textureSampler; uniform sampler2DRect textureSampler;
uniform int paintType; uniform int paintType;
@ -35,20 +39,23 @@ vec4 gammaMix(vec4 lCol, vec4 rCol, float ratio)
vec4 gradientColor(void) vec4 gradientColor(void)
{ {
float angle = atan(-paintGradientEnds[1].y + paintGradientEnds[0].y, paintGradientEnds[1].x - paintGradientEnds[0].x); float tStart = paintGradientEndsUnrotated[0];
float rotatedStartX = paintGradientEnds[0].x * cos(angle) - paintGradientEnds[0].y * sin(angle); float gradientLength = paintGradientEndsUnrotated[1] - tStart;
float rotatedEndX = paintGradientEnds[1].x * cos(angle) - paintGradientEnds[1].y * sin(angle);
float d = rotatedEndX - rotatedStartX;
float pX = paintUVCoordinates.x * cos(angle) - paintUVCoordinates.y * sin(angle); float t = paintUVCoordinates.x * paintGradientAngleCos - paintUVCoordinates.y * paintGradientAngleSin;
float mr = smoothstep(rotatedStartX + paintGradientPositions[0] * d, rotatedStartX + paintGradientPositions[1] * d, pX); float ti = paintGradientPositions[0] * gradientLength;
vec4 col = gammaMix(paintGradientColors[0], paintGradientColors[1], mr); float tni;
vec4 col = paintGradientColors[0];
for (int i = 1; i < paintGradientStopCount - 1; i++) for (int i = 0; i < paintGradientStopCount - 1; i++)
{ {
mr = smoothstep(rotatedStartX + paintGradientPositions[i] * d, rotatedStartX + paintGradientPositions[i + 1] * d, pX); tni = paintGradientPositions[i + 1] * gradientLength;
col = gammaMix(col, paintGradientColors[i + 1], mr);
float mixValue = smoothstep(tStart + ti, tStart + tni, t);
col = gammaMix(col, paintGradientColors[i + 1], mixValue);
ti = tni;
} }
return col; return col;

View File

@ -4,6 +4,10 @@ in vec2 uvCoordinates;
flat in int atlasPage; flat in int atlasPage;
in vec2 paintUVCoordinates; in vec2 paintUVCoordinates;
flat in float paintGradientAngleCos;
flat in float paintGradientAngleSin;
flat in float[2] paintGradientEndsUnrotated;
uniform sampler2DArray textureSampler; uniform sampler2DArray textureSampler;
uniform int paintType; uniform int paintType;
@ -38,20 +42,23 @@ vec4 gammaMix(vec4 lCol, vec4 rCol, float ratio)
vec4 gradientColor(void) vec4 gradientColor(void)
{ {
float angle = atan(-paintGradientEnds[1].y + paintGradientEnds[0].y, paintGradientEnds[1].x - paintGradientEnds[0].x); float tStart = paintGradientEndsUnrotated[0];
float rotatedStartX = paintGradientEnds[0].x * cos(angle) - paintGradientEnds[0].y * sin(angle); float gradientLength = paintGradientEndsUnrotated[1] - tStart;
float rotatedEndX = paintGradientEnds[1].x * cos(angle) - paintGradientEnds[1].y * sin(angle);
float d = rotatedEndX - rotatedStartX;
float pX = paintUVCoordinates.x * cos(angle) - paintUVCoordinates.y * sin(angle); float t = paintUVCoordinates.x * paintGradientAngleCos - paintUVCoordinates.y * paintGradientAngleSin;
float mr = smoothstep(rotatedStartX + paintGradientPositions[0] * d, rotatedStartX + paintGradientPositions[1] * d, pX); float ti = paintGradientPositions[0] * gradientLength;
vec4 col = gammaMix(paintGradientColors[0], paintGradientColors[1], mr); float tni;
vec4 col = paintGradientColors[0];
for (int i = 1; i < paintGradientStopCount - 1; i++) for (int i = 0; i < paintGradientStopCount - 1; i++)
{ {
mr = smoothstep(rotatedStartX + paintGradientPositions[i] * d, rotatedStartX + paintGradientPositions[i + 1] * d, pX); tni = paintGradientPositions[i + 1] * gradientLength;
col = gammaMix(col, paintGradientColors[i + 1], mr);
float mixValue = smoothstep(tStart + ti, tStart + tni, t);
col = gammaMix(col, paintGradientColors[i + 1], mixValue);
ti = tni;
} }
return col; return col;

View File

@ -4,6 +4,13 @@ in vec2 position;
in vec2 uvCoords; in vec2 uvCoords;
in vec2 paintUVCoords; in vec2 paintUVCoords;
uniform int paintType;
flat out float paintGradientAngleCos;
flat out float paintGradientAngleSin;
flat out float[2] paintGradientEndsUnrotated;
uniform vec2[2] paintGradientEnds;
out vec2 uvCoordinates; out vec2 uvCoordinates;
out vec2 paintUVCoordinates; out vec2 paintUVCoordinates;
@ -15,5 +22,18 @@ void main(void)
uvCoordinates = uvCoords; uvCoordinates = uvCoords;
paintUVCoordinates = paintUVCoords; paintUVCoordinates = paintUVCoords;
vec3 transformed = vec3((transformation * vec3(position, 1.0)).xy, 0.0); vec3 transformed = vec3((transformation * vec3(position, 1.0)).xy, 0.0);
if (paintType == 1)
{
float dy = paintGradientEnds[1].y - paintGradientEnds[0].y;
float dx = paintGradientEnds[1].x - paintGradientEnds[0].x;
float paintGradientAngle = atan(-dy, dx);
paintGradientAngleCos = cos(paintGradientAngle);
paintGradientAngleSin = sin(paintGradientAngle);
paintGradientEndsUnrotated[0] = paintGradientEnds[0].x * paintGradientAngleCos - paintGradientEnds[0].y * paintGradientAngleSin;
paintGradientEndsUnrotated[1] = paintGradientEnds[1].x * paintGradientAngleCos - paintGradientEnds[1].y * paintGradientAngleSin;
}
gl_Position = projection * vec4(transformed, 1.0); gl_Position = projection * vec4(transformed, 1.0);
} }

View File

@ -5,6 +5,13 @@ in vec2 uvCoords;
in int page; in int page;
in vec2 paintUVCoords; in vec2 paintUVCoords;
uniform int paintType;
flat out float paintGradientAngleCos;
flat out float paintGradientAngleSin;
flat out float[2] paintGradientEndsUnrotated;
uniform vec2[2] paintGradientEnds;
out vec2 uvCoordinates; out vec2 uvCoordinates;
out vec2 paintUVCoordinates; out vec2 paintUVCoordinates;
flat out int atlasPage; flat out int atlasPage;
@ -18,5 +25,18 @@ void main(void)
uvCoordinates = uvCoords; uvCoordinates = uvCoords;
paintUVCoordinates = paintUVCoords; paintUVCoordinates = paintUVCoords;
vec3 transformed = vec3((transformation * vec3(position, 1.0)).xy, 0.0); vec3 transformed = vec3((transformation * vec3(position, 1.0)).xy, 0.0);
if (paintType == 1)
{
float dy = paintGradientEnds[1].y - paintGradientEnds[0].y;
float dx = paintGradientEnds[1].x - paintGradientEnds[0].x;
float paintGradientAngle = atan(-dy, dx);
paintGradientAngleCos = cos(paintGradientAngle);
paintGradientAngleSin = sin(paintGradientAngle);
paintGradientEndsUnrotated[0] = paintGradientEnds[0].x * paintGradientAngleCos - paintGradientEnds[0].y * paintGradientAngleSin;
paintGradientEndsUnrotated[1] = paintGradientEnds[1].x * paintGradientAngleCos - paintGradientEnds[1].y * paintGradientAngleSin;
}
gl_Position = projection * vec4(transformed, 1.0); gl_Position = projection * vec4(transformed, 1.0);
} }

View File

@ -3,6 +3,10 @@
in vec2 uvCoordinates; in vec2 uvCoordinates;
in vec2 paintUVCoordinates; in vec2 paintUVCoordinates;
flat in float paintGradientAngleCos;
flat in float paintGradientAngleSin;
flat in float[2] paintGradientEndsUnrotated;
uniform sampler2DRect textureSampler; uniform sampler2DRect textureSampler;
uniform int paintType; uniform int paintType;
@ -35,20 +39,23 @@ vec4 gammaMix(vec4 lCol, vec4 rCol, float ratio)
vec4 gradientColor(void) vec4 gradientColor(void)
{ {
float angle = atan(-paintGradientEnds[1].y + paintGradientEnds[0].y, paintGradientEnds[1].x - paintGradientEnds[0].x); float tStart = paintGradientEndsUnrotated[0];
float rotatedStartX = paintGradientEnds[0].x * cos(angle) - paintGradientEnds[0].y * sin(angle); float gradientLength = paintGradientEndsUnrotated[1] - tStart;
float rotatedEndX = paintGradientEnds[1].x * cos(angle) - paintGradientEnds[1].y * sin(angle);
float d = rotatedEndX - rotatedStartX;
float pX = paintUVCoordinates.x * cos(angle) - paintUVCoordinates.y * sin(angle); float t = paintUVCoordinates.x * paintGradientAngleCos - paintUVCoordinates.y * paintGradientAngleSin;
float mr = smoothstep(rotatedStartX + paintGradientPositions[0] * d, rotatedStartX + paintGradientPositions[1] * d, pX); float ti = paintGradientPositions[0] * gradientLength;
vec4 col = gammaMix(paintGradientColors[0], paintGradientColors[1], mr); float tni;
vec4 col = paintGradientColors[0];
for (int i = 1; i < paintGradientStopCount - 1; i++) for (int i = 0; i < paintGradientStopCount - 1; i++)
{ {
mr = smoothstep(rotatedStartX + paintGradientPositions[i] * d, rotatedStartX + paintGradientPositions[i + 1] * d, pX); tni = paintGradientPositions[i + 1] * gradientLength;
col = gammaMix(col, paintGradientColors[i + 1], mr);
float mixValue = smoothstep(tStart + ti, tStart + tni, t);
col = gammaMix(col, paintGradientColors[i + 1], mixValue);
ti = tni;
} }
return col; return col;

View File

@ -4,6 +4,10 @@ in vec2 uvCoordinates;
flat in int atlasPage; flat in int atlasPage;
in vec2 paintUVCoordinates; in vec2 paintUVCoordinates;
flat in float paintGradientAngleCos;
flat in float paintGradientAngleSin;
flat in float[2] paintGradientEndsUnrotated;
uniform sampler2DArray textureSampler; uniform sampler2DArray textureSampler;
uniform int paintType; uniform int paintType;
@ -38,20 +42,23 @@ vec4 gammaMix(vec4 lCol, vec4 rCol, float ratio)
vec4 gradientColor(void) vec4 gradientColor(void)
{ {
float angle = atan(-paintGradientEnds[1].y + paintGradientEnds[0].y, paintGradientEnds[1].x - paintGradientEnds[0].x); float tStart = paintGradientEndsUnrotated[0];
float rotatedStartX = paintGradientEnds[0].x * cos(angle) - paintGradientEnds[0].y * sin(angle); float gradientLength = paintGradientEndsUnrotated[1] - tStart;
float rotatedEndX = paintGradientEnds[1].x * cos(angle) - paintGradientEnds[1].y * sin(angle);
float d = rotatedEndX - rotatedStartX;
float pX = paintUVCoordinates.x * cos(angle) - paintUVCoordinates.y * sin(angle); float t = paintUVCoordinates.x * paintGradientAngleCos - paintUVCoordinates.y * paintGradientAngleSin;
float mr = smoothstep(rotatedStartX + paintGradientPositions[0] * d, rotatedStartX + paintGradientPositions[1] * d, pX); float ti = paintGradientPositions[0] * gradientLength;
vec4 col = gammaMix(paintGradientColors[0], paintGradientColors[1], mr); float tni;
vec4 col = paintGradientColors[0];
for (int i = 1; i < paintGradientStopCount - 1; i++) for (int i = 0; i < paintGradientStopCount - 1; i++)
{ {
mr = smoothstep(rotatedStartX + paintGradientPositions[i] * d, rotatedStartX + paintGradientPositions[i + 1] * d, pX); tni = paintGradientPositions[i + 1] * gradientLength;
col = gammaMix(col, paintGradientColors[i + 1], mr);
float mixValue = smoothstep(tStart + ti, tStart + tni, t);
col = gammaMix(col, paintGradientColors[i + 1], mixValue);
ti = tni;
} }
return col; return col;

View File

@ -4,6 +4,13 @@ in vec2 position;
in vec2 uvCoords; in vec2 uvCoords;
in vec2 paintUVCoords; in vec2 paintUVCoords;
uniform int paintType;
flat out float paintGradientAngleCos;
flat out float paintGradientAngleSin;
flat out float[2] paintGradientEndsUnrotated;
uniform vec2[2] paintGradientEnds;
out vec2 uvCoordinates; out vec2 uvCoordinates;
out vec2 paintUVCoordinates; out vec2 paintUVCoordinates;
@ -15,5 +22,18 @@ void main(void)
uvCoordinates = uvCoords; uvCoordinates = uvCoords;
paintUVCoordinates = paintUVCoords; paintUVCoordinates = paintUVCoords;
vec3 transformed = vec3((transformation * vec3(position, 1.0)).xy, 0.0); vec3 transformed = vec3((transformation * vec3(position, 1.0)).xy, 0.0);
if (paintType == 1)
{
float dy = paintGradientEnds[1].y - paintGradientEnds[0].y;
float dx = paintGradientEnds[1].x - paintGradientEnds[0].x;
float paintGradientAngle = atan(-dy, dx);
paintGradientAngleCos = cos(paintGradientAngle);
paintGradientAngleSin = sin(paintGradientAngle);
paintGradientEndsUnrotated[0] = paintGradientEnds[0].x * paintGradientAngleCos - paintGradientEnds[0].y * paintGradientAngleSin;
paintGradientEndsUnrotated[1] = paintGradientEnds[1].x * paintGradientAngleCos - paintGradientEnds[1].y * paintGradientAngleSin;
}
gl_Position = projection * vec4(transformed, 1.0); gl_Position = projection * vec4(transformed, 1.0);
} }

View File

@ -5,6 +5,13 @@ in vec2 uvCoords;
in int page; in int page;
in vec2 paintUVCoords; in vec2 paintUVCoords;
uniform int paintType;
flat out float paintGradientAngleCos;
flat out float paintGradientAngleSin;
flat out float[2] paintGradientEndsUnrotated;
uniform vec2[2] paintGradientEnds;
out vec2 uvCoordinates; out vec2 uvCoordinates;
out vec2 paintUVCoordinates; out vec2 paintUVCoordinates;
flat out int atlasPage; flat out int atlasPage;
@ -18,5 +25,18 @@ void main(void)
uvCoordinates = uvCoords; uvCoordinates = uvCoords;
paintUVCoordinates = paintUVCoords; paintUVCoordinates = paintUVCoords;
vec3 transformed = vec3((transformation * vec3(position, 1.0)).xy, 0.0); vec3 transformed = vec3((transformation * vec3(position, 1.0)).xy, 0.0);
if (paintType == 1)
{
float dy = paintGradientEnds[1].y - paintGradientEnds[0].y;
float dx = paintGradientEnds[1].x - paintGradientEnds[0].x;
float paintGradientAngle = atan(-dy, dx);
paintGradientAngleCos = cos(paintGradientAngle);
paintGradientAngleSin = sin(paintGradientAngle);
paintGradientEndsUnrotated[0] = paintGradientEnds[0].x * paintGradientAngleCos - paintGradientEnds[0].y * paintGradientAngleSin;
paintGradientEndsUnrotated[1] = paintGradientEnds[1].x * paintGradientAngleCos - paintGradientEnds[1].y * paintGradientAngleSin;
}
gl_Position = projection * vec4(transformed, 1.0); gl_Position = projection * vec4(transformed, 1.0);
} }