Reduce gpu mem usage
This commit is contained in:
@@ -1,14 +1,12 @@
|
||||
#version 330
|
||||
uniform sampler2D tex0;
|
||||
uniform sampler2D tex1;
|
||||
uniform sampler2D tex2;
|
||||
uniform sampler2D texmask;
|
||||
uniform sampler2D texa;
|
||||
uniform sampler2D texb;
|
||||
uniform sampler2D texc;
|
||||
uniform float opac;
|
||||
uniform int blending;
|
||||
in vec2 texCoord;
|
||||
out vec4 FragColor[3];
|
||||
out vec4 FragColor;
|
||||
vec3 hsv_to_rgb(const vec3 c) {
|
||||
const vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
|
||||
vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
|
||||
@@ -24,67 +22,66 @@ vec3 rgb_to_hsv(const vec3 c) {
|
||||
}
|
||||
void main() {
|
||||
vec4 col0 = textureLod(tex0, texCoord, 0);
|
||||
vec4 col1 = textureLod(tex1, texCoord, 0);
|
||||
vec4 col2 = textureLod(tex2, texCoord, 0);
|
||||
vec4 cola = textureLod(texa, texCoord, 0);
|
||||
vec4 colb = textureLod(texb, texCoord, 0);
|
||||
vec4 colc = textureLod(texc, texCoord, 0);
|
||||
float str = col0.a * opac;
|
||||
if (blending == 0) { // Mix
|
||||
FragColor[0] = vec4(mix(cola.rgb, col0.rgb, str), max(col0.a, cola.a));
|
||||
str *= textureLod(texmask, texCoord, 0).r;
|
||||
if (blending == -1) { // Merging _nor and _pack
|
||||
vec4 col1 = textureLod(tex1, texCoord, 0);
|
||||
FragColor = vec4(mix(cola, col1, str));
|
||||
}
|
||||
else if (blending == 0) { // Mix
|
||||
FragColor = vec4(mix(cola.rgb, col0.rgb, str), max(col0.a, cola.a));
|
||||
}
|
||||
else if (blending == 1) { // Darken
|
||||
FragColor[0] = vec4(mix(cola.rgb, min(cola.rgb, col0.rgb), str), max(col0.a, cola.a));
|
||||
FragColor = vec4(mix(cola.rgb, min(cola.rgb, col0.rgb), str), max(col0.a, cola.a));
|
||||
}
|
||||
else if (blending == 2) { // Multiply
|
||||
FragColor[0] = vec4(mix(cola.rgb, cola.rgb * col0.rgb, str), max(col0.a, cola.a));
|
||||
FragColor = vec4(mix(cola.rgb, cola.rgb * col0.rgb, str), max(col0.a, cola.a));
|
||||
}
|
||||
else if (blending == 3) { // Burn
|
||||
FragColor[0] = vec4(mix(cola.rgb, vec3(1.0, 1.0, 1.0) - (vec3(1.0, 1.0, 1.0) - cola.rgb) / col0.rgb, str), max(col0.a, cola.a));
|
||||
FragColor = vec4(mix(cola.rgb, vec3(1.0, 1.0, 1.0) - (vec3(1.0, 1.0, 1.0) - cola.rgb) / col0.rgb, str), max(col0.a, cola.a));
|
||||
}
|
||||
else if (blending == 4) { // Lighten
|
||||
FragColor[0] = vec4(max(cola.rgb, col0.rgb * str), max(col0.a, cola.a));
|
||||
FragColor = vec4(max(cola.rgb, col0.rgb * str), max(col0.a, cola.a));
|
||||
}
|
||||
else if (blending == 5) { // Screen
|
||||
FragColor[0] = vec4((vec3(1.0, 1.0, 1.0) - (vec3(1.0 - str, 1.0 - str, 1.0 - str) + str * (vec3(1.0, 1.0, 1.0) - col0.rgb)) * (vec3(1.0, 1.0, 1.0) - cola.rgb)), max(col0.a, cola.a));
|
||||
FragColor = vec4((vec3(1.0, 1.0, 1.0) - (vec3(1.0 - str, 1.0 - str, 1.0 - str) + str * (vec3(1.0, 1.0, 1.0) - col0.rgb)) * (vec3(1.0, 1.0, 1.0) - cola.rgb)), max(col0.a, cola.a));
|
||||
}
|
||||
else if (blending == 6) { // Dodge
|
||||
FragColor[0] = vec4(mix(cola.rgb, cola.rgb / (vec3(1.0, 1.0, 1.0) - col0.rgb), str), max(col0.a, cola.a));
|
||||
FragColor = vec4(mix(cola.rgb, cola.rgb / (vec3(1.0, 1.0, 1.0) - col0.rgb), str), max(col0.a, cola.a));
|
||||
}
|
||||
else if (blending == 7) { // Add
|
||||
FragColor[0] = vec4(mix(cola.rgb, cola.rgb + col0.rgb, str), max(col0.a, cola.a));
|
||||
FragColor = vec4(mix(cola.rgb, cola.rgb + col0.rgb, str), max(col0.a, cola.a));
|
||||
}
|
||||
else if (blending == 8) { // Overlay
|
||||
//FragColor[0] = vec4(mix(cola.rgb, (cola.rgb < vec3(0.5, 0.5, 0.5) ? vec3(2.0, 2.0, 2.0) * cola.rgb * col0.rgb : vec3(1.0, 1.0, 1.0) - vec3(2.0, 2.0, 2.0) * (vec3(1.0, 1.0, 1.0) - col0.rgb) * (vec3(1.0, 1.0, 1.0) - cola.rgb)), str), max(col0.a, cola.a)); // TODO
|
||||
FragColor[0] = vec4(mix(cola.rgb, col0.rgb, str), max(col0.a, cola.a));
|
||||
//FragColor = vec4(mix(cola.rgb, (cola.rgb < vec3(0.5, 0.5, 0.5) ? vec3(2.0, 2.0, 2.0) * cola.rgb * col0.rgb : vec3(1.0, 1.0, 1.0) - vec3(2.0, 2.0, 2.0) * (vec3(1.0, 1.0, 1.0) - col0.rgb) * (vec3(1.0, 1.0, 1.0) - cola.rgb)), str), max(col0.a, cola.a)); // TODO
|
||||
FragColor = vec4(mix(cola.rgb, col0.rgb, str), max(col0.a, cola.a));
|
||||
}
|
||||
else if (blending == 9) { // Soft Light
|
||||
FragColor[0] = vec4(((1.0 - str) * cola.rgb + str * ((vec3(1.0, 1.0, 1.0) - cola.rgb) * col0.rgb * cola.rgb + cola.rgb * (vec3(1.0, 1.0, 1.0) - (vec3(1.0, 1.0, 1.0) - col0.rgb) * (vec3(1.0, 1.0, 1.0) - cola.rgb)))), max(col0.a, cola.a));
|
||||
FragColor = vec4(((1.0 - str) * cola.rgb + str * ((vec3(1.0, 1.0, 1.0) - cola.rgb) * col0.rgb * cola.rgb + cola.rgb * (vec3(1.0, 1.0, 1.0) - (vec3(1.0, 1.0, 1.0) - col0.rgb) * (vec3(1.0, 1.0, 1.0) - cola.rgb)))), max(col0.a, cola.a));
|
||||
}
|
||||
else if (blending == 10) { // Linear Light
|
||||
FragColor[0] = vec4((cola.rgb + str * (vec3(2.0, 2.0, 2.0) * (col0.rgb - vec3(0.5, 0.5, 0.5)))), max(col0.a, cola.a));
|
||||
FragColor = vec4((cola.rgb + str * (vec3(2.0, 2.0, 2.0) * (col0.rgb - vec3(0.5, 0.5, 0.5)))), max(col0.a, cola.a));
|
||||
}
|
||||
else if (blending == 11) { // Difference
|
||||
FragColor[0] = vec4(mix(cola.rgb, abs(cola.rgb - col0.rgb), str), max(col0.a, cola.a));
|
||||
FragColor = vec4(mix(cola.rgb, abs(cola.rgb - col0.rgb), str), max(col0.a, cola.a));
|
||||
}
|
||||
else if (blending == 12) { // Subtract
|
||||
FragColor[0] = vec4(mix(cola.rgb, cola.rgb - col0.rgb, str), max(col0.a, cola.a));
|
||||
FragColor = vec4(mix(cola.rgb, cola.rgb - col0.rgb, str), max(col0.a, cola.a));
|
||||
}
|
||||
else if (blending == 13) { // Divide
|
||||
FragColor[0] = vec4(vec3(1.0 - str, 1.0 - str, 1.0 - str) * cola.rgb + vec3(str, str, str) * cola.rgb / col0.rgb, max(col0.a, cola.a));
|
||||
FragColor = vec4(vec3(1.0 - str, 1.0 - str, 1.0 - str) * cola.rgb + vec3(str, str, str) * cola.rgb / col0.rgb, max(col0.a, cola.a));
|
||||
}
|
||||
else if (blending == 14) { // Hue
|
||||
FragColor[0] = vec4(mix(cola.rgb, hsv_to_rgb(vec3(rgb_to_hsv(col0.rgb).r, rgb_to_hsv(cola.rgb).g, rgb_to_hsv(cola.rgb).b)), str), max(col0.a, cola.a));
|
||||
FragColor = vec4(mix(cola.rgb, hsv_to_rgb(vec3(rgb_to_hsv(col0.rgb).r, rgb_to_hsv(cola.rgb).g, rgb_to_hsv(cola.rgb).b)), str), max(col0.a, cola.a));
|
||||
}
|
||||
else if (blending == 15) { // Saturation
|
||||
FragColor[0] = vec4(mix(cola.rgb, hsv_to_rgb(vec3(rgb_to_hsv(cola.rgb).r, rgb_to_hsv(col0.rgb).g, rgb_to_hsv(cola.rgb).b)), str), max(col0.a, cola.a));
|
||||
FragColor = vec4(mix(cola.rgb, hsv_to_rgb(vec3(rgb_to_hsv(cola.rgb).r, rgb_to_hsv(col0.rgb).g, rgb_to_hsv(cola.rgb).b)), str), max(col0.a, cola.a));
|
||||
}
|
||||
else if (blending == 16) { // Color
|
||||
FragColor[0] = vec4(mix(cola.rgb, hsv_to_rgb(vec3(rgb_to_hsv(col0.rgb).r, rgb_to_hsv(col0.rgb).g, rgb_to_hsv(cola.rgb).b)), str), max(col0.a, cola.a));
|
||||
FragColor = vec4(mix(cola.rgb, hsv_to_rgb(vec3(rgb_to_hsv(col0.rgb).r, rgb_to_hsv(col0.rgb).g, rgb_to_hsv(cola.rgb).b)), str), max(col0.a, cola.a));
|
||||
}
|
||||
else { // Value
|
||||
FragColor[0] = vec4(mix(cola.rgb, hsv_to_rgb(vec3(rgb_to_hsv(cola.rgb).r, rgb_to_hsv(cola.rgb).g, rgb_to_hsv(col0.rgb).b)), str), max(col0.a, cola.a));
|
||||
FragColor = vec4(mix(cola.rgb, hsv_to_rgb(vec3(rgb_to_hsv(cola.rgb).r, rgb_to_hsv(cola.rgb).g, rgb_to_hsv(col0.rgb).b)), str), max(col0.a, cola.a));
|
||||
}
|
||||
FragColor[1] = vec4(mix(colb, col1, str));
|
||||
FragColor[2] = vec4(mix(colc, col2, str));
|
||||
}
|
||||
|
||||
Binary file not shown.
@@ -2,14 +2,10 @@ Texture2D<float4> tex0;
|
||||
SamplerState _tex0_sampler;
|
||||
Texture2D<float4> tex1;
|
||||
SamplerState _tex1_sampler;
|
||||
Texture2D<float4> tex2;
|
||||
SamplerState _tex2_sampler;
|
||||
Texture2D<float4> texmask;
|
||||
SamplerState _texmask_sampler;
|
||||
Texture2D<float4> texa;
|
||||
SamplerState _texa_sampler;
|
||||
Texture2D<float4> texb;
|
||||
SamplerState _texb_sampler;
|
||||
Texture2D<float4> texc;
|
||||
SamplerState _texc_sampler;
|
||||
uniform float opac;
|
||||
uniform int blending;
|
||||
float3 hsv_to_rgb(const float3 c) {
|
||||
@@ -25,17 +21,18 @@ float3 rgb_to_hsv(const float3 c) {
|
||||
float e = 1.0e-10;
|
||||
return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);
|
||||
}
|
||||
struct SPIRV_Cross_Output { float4 color0 : SV_Target0; float4 color1 : SV_Target1; float4 color2 : SV_Target2; };
|
||||
struct SPIRV_Cross_Output { float4 color0 : SV_Target0; };
|
||||
SPIRV_Cross_Output main(float2 texCoord : TEXCOORD0) {
|
||||
float4 col0 = tex0.SampleLevel(_tex0_sampler, texCoord, 0);
|
||||
float4 col1 = tex1.SampleLevel(_tex1_sampler, texCoord, 0);
|
||||
float4 col2 = tex2.SampleLevel(_tex2_sampler, texCoord, 0);
|
||||
float4 cola = texa.SampleLevel(_texa_sampler, texCoord, 0);
|
||||
float4 colb = texb.SampleLevel(_texb_sampler, texCoord, 0);
|
||||
float4 colc = texc.SampleLevel(_texc_sampler, texCoord, 0);
|
||||
float str = col0.a * opac;
|
||||
str *= texmask.SampleLevel(_texmask_sampler, texCoord, 0).r;
|
||||
SPIRV_Cross_Output stage_output;
|
||||
if (blending == 0) { // Mix
|
||||
if (blending == -1) { // Merging _nor and _pack
|
||||
float4 col1 = tex1.SampleLevel(_tex1_sampler, texCoord, 0);
|
||||
stage_output.color0 = float4(lerp(cola, col1, str));
|
||||
}
|
||||
else if (blending == 0) { // Mix
|
||||
stage_output.color0 = float4(lerp(cola.rgb, col0.rgb, str), max(col0.a, cola.a));
|
||||
}
|
||||
else if (blending == 1) { // Darken
|
||||
@@ -89,7 +86,5 @@ SPIRV_Cross_Output main(float2 texCoord : TEXCOORD0) {
|
||||
else { // Value
|
||||
stage_output.color0 = float4(lerp(cola.rgb, hsv_to_rgb(float3(rgb_to_hsv(cola.rgb).r, rgb_to_hsv(cola.rgb).g, rgb_to_hsv(col0.rgb).b)), str), max(col0.a, cola.a));
|
||||
}
|
||||
stage_output.color1 = float4(lerp(colb, col1, str));
|
||||
stage_output.color2 = float4(lerp(colc, col2, str));
|
||||
return stage_output;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user