Skip to content

Commit 222868e

Browse files
committed
Fixed a few issues
There was a typo on the CGAColorspace shader and several shaders required specification of the constant address space.
1 parent 9d3a0a6 commit 222868e

File tree

12 files changed

+268
-29
lines changed

12 files changed

+268
-29
lines changed

examples/Mac/FilterShowcase/FilterShowcase/FilterOperations.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -689,7 +689,7 @@ let filterOperations: Array<FilterOperationInterface> = [
689689
// titleName:"Posterize",
690690
// sliderConfiguration:.enabled(minimumValue:1.0, maximumValue:20.0, initialValue:10.0),
691691
// sliderUpdateCallback: {(filter, sliderValue) in
692-
// (filter as! GPUImage.Posterize).colorLevels = round(Float(sliderValue))
692+
// filter.colorLevels = round(Float(sliderValue))
693693
// },
694694
// filterOperationType:.singleInput
695695
// ),

framework/GPUImage.xcodeproj/project.pbxproj

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,10 @@
149149
795ECACA21EF9806000EF927 /* ColorLocalBinaryPattern.metal in Sources */ = {isa = PBXBuildFile; fileRef = 795ECAC821EF9806000EF927 /* ColorLocalBinaryPattern.metal */; };
150150
795ECACC21F02E54000EF927 /* PolkaDot.metal in Sources */ = {isa = PBXBuildFile; fileRef = 79DD50D2213458BA004EF308 /* PolkaDot.metal */; };
151151
795ECACD21F02E54000EF927 /* PolkaDot.metal in Sources */ = {isa = PBXBuildFile; fileRef = 79DD50D2213458BA004EF308 /* PolkaDot.metal */; };
152+
796B989E238333120013FBD0 /* Sharpen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 796B989D238333120013FBD0 /* Sharpen.swift */; };
153+
796B989F238333120013FBD0 /* Sharpen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 796B989D238333120013FBD0 /* Sharpen.swift */; };
154+
796B98A1238333200013FBD0 /* Sharpen.metal in Sources */ = {isa = PBXBuildFile; fileRef = 796B98A0238333200013FBD0 /* Sharpen.metal */; };
155+
796B98A2238333200013FBD0 /* Sharpen.metal in Sources */ = {isa = PBXBuildFile; fileRef = 796B98A0238333200013FBD0 /* Sharpen.metal */; };
152156
7971E0C02357B2D8006F150F /* AdaptiveThreshold.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7971E0BF2357B2D8006F150F /* AdaptiveThreshold.swift */; };
153157
7971E0C12357B2D8006F150F /* AdaptiveThreshold.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7971E0BF2357B2D8006F150F /* AdaptiveThreshold.swift */; };
154158
7971E0C32357B2E9006F150F /* AdaptiveThreshold.metal in Sources */ = {isa = PBXBuildFile; fileRef = 7971E0C22357B2E9006F150F /* AdaptiveThreshold.metal */; };
@@ -479,6 +483,8 @@
479483
795ECAC221EF961F000EF927 /* LocalBinaryPattern.metal */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.metal; name = LocalBinaryPattern.metal; path = Source/Operations/LocalBinaryPattern.metal; sourceTree = "<group>"; };
480484
795ECAC521EF97F8000EF927 /* ColorLocalBinaryPattern.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = ColorLocalBinaryPattern.swift; path = Source/Operations/ColorLocalBinaryPattern.swift; sourceTree = "<group>"; };
481485
795ECAC821EF9806000EF927 /* ColorLocalBinaryPattern.metal */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.metal; name = ColorLocalBinaryPattern.metal; path = Source/Operations/ColorLocalBinaryPattern.metal; sourceTree = "<group>"; };
486+
796B989D238333120013FBD0 /* Sharpen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = Sharpen.swift; path = Source/Operations/Sharpen.swift; sourceTree = "<group>"; };
487+
796B98A0238333200013FBD0 /* Sharpen.metal */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.metal; name = Sharpen.metal; path = Source/Operations/Sharpen.metal; sourceTree = "<group>"; };
482488
7971E0BF2357B2D8006F150F /* AdaptiveThreshold.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AdaptiveThreshold.swift; path = Source/Operations/AdaptiveThreshold.swift; sourceTree = "<group>"; };
483489
7971E0C22357B2E9006F150F /* AdaptiveThreshold.metal */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.metal; name = AdaptiveThreshold.metal; path = Source/Operations/AdaptiveThreshold.metal; sourceTree = "<group>"; };
484490
7971E0C52357BB75006F150F /* TiltShift.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = TiltShift.swift; path = Source/Operations/TiltShift.swift; sourceTree = "<group>"; };
@@ -664,6 +670,8 @@
664670
79DD50D2213458BA004EF308 /* PolkaDot.metal */,
665671
4C280F75213426D6001A985C /* Posterize.swift */,
666672
4C280F78213426EC001A985C /* Posterize.metal */,
673+
796B989D238333120013FBD0 /* Sharpen.swift */,
674+
796B98A0238333200013FBD0 /* Sharpen.metal */,
667675
795ECAA721ED2967000EF927 /* Sketch.swift */,
668676
795ECAAA21ED2975000EF927 /* Sketch.metal */,
669677
BC25F89D22C15D3A00CBBD15 /* SmoothToonFilter.swift */,
@@ -1216,11 +1224,13 @@
12161224
7957437B20FE2A6C001EAE0A /* LuminanceThreshold.swift in Sources */,
12171225
7999997A2226EA4A007404F2 /* EmbossFilter.swift in Sources */,
12181226
7957438120FE2D97001EAE0A /* FalseColor.swift in Sources */,
1227+
796B98A1238333200013FBD0 /* Sharpen.metal in Sources */,
12191228
795ECAA221ED253B000EF927 /* ThresholdSobelEdgeDetection.swift in Sources */,
12201229
79C952C32368C9D200F18D0A /* ColourFASTFeatureDetection.metal in Sources */,
12211230
79CB6E41210A53CA0042F87B /* BlendShaderTypes.metal in Sources */,
12221231
79E30E6920F10F9C005FA13C /* Passthrough.metal in Sources */,
12231232
79EB1B892125D7630049135E /* ChromaKeyBlend.metal in Sources */,
1233+
796B989E238333120013FBD0 /* Sharpen.swift in Sources */,
12241234
795ECA8621E91B38000EF927 /* CGAColorspace.swift in Sources */,
12251235
79A81C8E2100F0E300A3B43A /* OpacityAdjustment.swift in Sources */,
12261236
BCF119A72211FAA000C4A579 /* BulgeDistortion.metal in Sources */,
@@ -1419,11 +1429,13 @@
14191429
7957438220FE2D97001EAE0A /* FalseColor.swift in Sources */,
14201430
7999997B2226EA4A007404F2 /* EmbossFilter.swift in Sources */,
14211431
7957437220FBED78001EAE0A /* RGBAdjustment.metal in Sources */,
1432+
796B98A2238333200013FBD0 /* Sharpen.metal in Sources */,
14221433
795ECAA321ED253B000EF927 /* ThresholdSobelEdgeDetection.swift in Sources */,
14231434
79C952C42368C9D200F18D0A /* ColourFASTFeatureDetection.metal in Sources */,
14241435
79CB6E42210A53CA0042F87B /* BlendShaderTypes.metal in Sources */,
14251436
79A81C8F2100F0E300A3B43A /* OpacityAdjustment.swift in Sources */,
14261437
79EB1B8A2125D7630049135E /* ChromaKeyBlend.metal in Sources */,
1438+
796B989F238333120013FBD0 /* Sharpen.swift in Sources */,
14271439
795ECA8721E91B38000EF927 /* CGAColorspace.swift in Sources */,
14281440
BCFCD46920FCE91800560BC9 /* DissolveBlend.swift in Sources */,
14291441
BCF119A82211FAA000C4A579 /* BulgeDistortion.metal in Sources */,

framework/Source/Operations/BlendShaderTypes.metal

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ half3 setsat(half3 c, half s) {
5858
/* b is max, r is mid, g is min */
5959
c.r = mid(c.g, c.r, c.b, s);
6060
c.b = s;
61-
c.r = 0.0h;
61+
c.g = 0.0h;
6262
}
6363
} else if (c.r > c.b) {
6464
/* g is max, r is mid, b is min */

framework/Source/Operations/CGAColorspace.metal

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ fragment half4 CGAColorspaceFragment(SingleInputVertexIO fragmentInput [[stage_i
1717
half4 colorWhite = half4(1.0h);
1818
half4 colorBlack = half4(0.0h, 0.0h, 0.0h, 1.0h);
1919

20-
half4 endColor;
2120
half blackDistance = distance(color, colorBlack);
2221
half whiteDistance = distance(color, colorWhite);
2322
half magentaDistance = distance(color, colorMagenta);

framework/Source/Operations/ColourFASTFeatureDetection.metal

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ typedef struct
1919
float2 bottomRightTextureCoordinate [[user(bottomRightTextureCoordinate)]];
2020
} ColourFASTVertexIO;
2121

22-
vertex ColourFASTVertexIO colourFASTDecriptorVertex(device packed_float2 *position [[buffer(0)]],
23-
device packed_float2 *textureCoordinate [[buffer(1)]],
24-
device packed_float2 *textureCoordinate2 [[buffer(2)]],
22+
vertex ColourFASTVertexIO colourFASTDecriptorVertex(const device packed_float2 *position [[buffer(0)]],
23+
const device packed_float2 *textureCoordinate [[buffer(1)]],
24+
const device packed_float2 *textureCoordinate2 [[buffer(2)]],
2525
uint vid [[vertex_id]])
2626
{
2727
ColourFASTVertexIO outputVertices;

framework/Source/Operations/MotionBlur.metal

Lines changed: 90 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,97 @@
1-
//
2-
// MotionBlur.metal
3-
// GPUImage
4-
//
5-
// Created by Janie Clayton on 2/13/19.
6-
// Copyright © 2019 Red Queen Coder, LLC. All rights reserved.
7-
//
8-
91
#include <metal_stdlib>
102
using namespace metal;
113

4+
typedef struct
5+
{
6+
float4 position [[position]];
7+
8+
float2 textureCoordinate [[user(textureCoordinate)]];
9+
10+
float2 oneStepBackTextureCoordinate [[user(oneStepBackTextureCoordinate)]];
11+
float2 twoStepsBackTextureCoordinate [[user(twoStepsBackTextureCoordinate)]];
12+
float2 threeStepsBackTextureCoordinate [[user(threeStepsBackTextureCoordinate)]];
13+
float2 fourStepsBackTextureCoordinate [[user(fourStepsBackTextureCoordinate)]];
14+
15+
float2 oneStepForwardTextureCoordinate [[user(oneStepForwardTextureCoordinate)]];
16+
float2 twoStepsForwardTextureCoordinate [[user(twoStepsForwardTextureCoordinate)]];
17+
float2 threeStepsForwardTextureCoordinate [[user(threeStepsForwardTextureCoordinate)]];
18+
float2 fourStepsForwardTextureCoordinate [[user(fourStepsForwardTextureCoordinate)]];
19+
} MotionBlurVertexIO;
20+
21+
vertex MotionBlurVertexIO motionBlurVertex(const device packed_float2 *position [[buffer(0)]],
22+
const device packed_float2 *textureCoordinate [[buffer(1)]],
23+
uint vid [[vertex_id]])
24+
{
25+
MotionBlurVertexIO outputVertices;
26+
outputVertices.position = float4(position[vid], 0, 1.0);
27+
28+
float2 singleHeightStep = float2(0.0, 1.0);
29+
30+
outputVertices.textureCoordinate = textureCoordinate[vid];
31+
outputVertices.oneStepBackTextureCoordinate = textureCoordinate[vid] - singleHeightStep;
32+
outputVertices.twoStepsBackTextureCoordinate = textureCoordinate[vid] - 2.0 * singleHeightStep;
33+
outputVertices.threeStepsBackTextureCoordinate = textureCoordinate[vid] - 3.0 * singleHeightStep;
34+
outputVertices.fourStepsBackTextureCoordinate = textureCoordinate[vid] - 4.0 * singleHeightStep;
35+
outputVertices.oneStepForwardTextureCoordinate = textureCoordinate[vid] - singleHeightStep;
36+
outputVertices.twoStepsForwardTextureCoordinate = textureCoordinate[vid] - 2.0 * singleHeightStep;
37+
outputVertices.threeStepsForwardTextureCoordinate = textureCoordinate[vid] - 3.0 * singleHeightStep;
38+
outputVertices.fourStepsForwardTextureCoordinate = textureCoordinate[vid] - 4.0 * singleHeightStep;
39+
40+
return outputVertices;
41+
}
42+
// Vertex Shader
43+
/*
44+
attribute vec4 position;
45+
attribute vec4 inputTextureCoordinate;
46+
47+
uniform vec2 directionalTexelStep;
48+
49+
varying vec2 textureCoordinate;
50+
varying vec2 oneStepBackTextureCoordinate;
51+
varying vec2 twoStepsBackTextureCoordinate;
52+
varying vec2 threeStepsBackTextureCoordinate;
53+
varying vec2 fourStepsBackTextureCoordinate;
54+
varying vec2 oneStepForwardTextureCoordinate;
55+
varying vec2 twoStepsForwardTextureCoordinate;
56+
varying vec2 threeStepsForwardTextureCoordinate;
57+
varying vec2 fourStepsForwardTextureCoordinate;
58+
59+
void main()
60+
{
61+
gl_Position = position;
62+
63+
textureCoordinate = inputTextureCoordinate.xy;
64+
oneStepBackTextureCoordinate = inputTextureCoordinate.xy - directionalTexelStep;
65+
twoStepsBackTextureCoordinate = inputTextureCoordinate.xy - 2.0 * directionalTexelStep;
66+
threeStepsBackTextureCoordinate = inputTextureCoordinate.xy - 3.0 * directionalTexelStep;
67+
fourStepsBackTextureCoordinate = inputTextureCoordinate.xy - 4.0 * directionalTexelStep;
68+
oneStepForwardTextureCoordinate = inputTextureCoordinate.xy + directionalTexelStep;
69+
twoStepsForwardTextureCoordinate = inputTextureCoordinate.xy + 2.0 * directionalTexelStep;
70+
threeStepsForwardTextureCoordinate = inputTextureCoordinate.xy + 3.0 * directionalTexelStep;
71+
fourStepsForwardTextureCoordinate = inputTextureCoordinate.xy + 4.0 * directionalTexelStep;
72+
}
73+
74+
*/
75+
76+
fragment half4 motionBlurFragment(MotionBlurVertexIO fragmentInput [[stage_in]],
77+
texture2d<half> inputTexture [[texture(0)]])
78+
{
79+
constexpr sampler quadSampler(coord::pixel);
80+
half4 fragmentColor = inputTexture.sample(quadSampler, fragmentInput.textureCoordinate) * 0.18;
81+
fragmentColor += inputTexture.sample(quadSampler, fragmentInput.oneStepBackTextureCoordinate) * 0.15;
82+
fragmentColor += inputTexture.sample(quadSampler, fragmentInput.twoStepsBackTextureCoordinate) * 0.12;
83+
fragmentColor += inputTexture.sample(quadSampler, fragmentInput.threeStepsBackTextureCoordinate) * 0.09;
84+
fragmentColor += inputTexture.sample(quadSampler, fragmentInput.fourStepsBackTextureCoordinate) * 0.05;
85+
fragmentColor += inputTexture.sample(quadSampler, fragmentInput.oneStepForwardTextureCoordinate) * 0.15;
86+
fragmentColor += inputTexture.sample(quadSampler, fragmentInput.twoStepsForwardTextureCoordinate) * 0.12;
87+
fragmentColor += inputTexture.sample(quadSampler, fragmentInput.threeStepsForwardTextureCoordinate) * 0.09;
88+
fragmentColor += inputTexture.sample(quadSampler, fragmentInput.fourStepsForwardTextureCoordinate) * 0.05;
89+
90+
return fragmentColor;
91+
}
92+
1293

94+
// Fragment Shader
1395
/*
1496
uniform sampler2D inputImageTexture;
1597

framework/Source/Operations/MotionBlur.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ public class MotionBlur: BasicOperation {
55
public var blurAngle:Float = 0.0
66

77
public init() {
8-
super.init(fragmentFunctionName:"MotionBlurFragment", numberOfInputs:1)
8+
super.init(vertexFunctionName:"motionBlurVertex", fragmentFunctionName:"motionBlurFragment", numberOfInputs:1)
99
}
1010

1111
// override func configureFramebufferSpecificUniforms(_ inputFramebuffer:Framebuffer) {

framework/Source/Operations/NearbyTexelSampling.metal

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
#include "TexelSamplingTypes.h"
33
using namespace metal;
44

5-
vertex NearbyTexelVertexIO nearbyTexelSampling(device packed_float2 *position [[buffer(0)]],
6-
device packed_float2 *textureCoordinate [[buffer(1)]],
5+
vertex NearbyTexelVertexIO nearbyTexelSampling(const device packed_float2 *position [[buffer(0)]],
6+
const device packed_float2 *textureCoordinate [[buffer(1)]],
77
uint vid [[vertex_id]])
88
{
99
NearbyTexelVertexIO outputVertices;

framework/Source/Operations/Passthrough.metal

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33

44
using namespace metal;
55

6-
vertex SingleInputVertexIO oneInputVertex(device packed_float2 *position [[buffer(0)]],
7-
device packed_float2 *texturecoord [[buffer(1)]],
6+
vertex SingleInputVertexIO oneInputVertex(const device packed_float2 *position [[buffer(0)]],
7+
const device packed_float2 *texturecoord [[buffer(1)]],
88
uint vid [[vertex_id]])
99
{
1010
SingleInputVertexIO outputVertices;
@@ -24,9 +24,9 @@ fragment half4 passthroughFragment(SingleInputVertexIO fragmentInput [[stage_in]
2424
return color;
2525
}
2626

27-
vertex TwoInputVertexIO twoInputVertex(device packed_float2 *position [[buffer(0)]],
28-
device packed_float2 *texturecoord [[buffer(1)]],
29-
device packed_float2 *texturecoord2 [[buffer(2)]],
27+
vertex TwoInputVertexIO twoInputVertex(const device packed_float2 *position [[buffer(0)]],
28+
const device packed_float2 *texturecoord [[buffer(1)]],
29+
const device packed_float2 *texturecoord2 [[buffer(2)]],
3030
uint vid [[vertex_id]])
3131
{
3232
TwoInputVertexIO outputVertices;
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
#include <metal_stdlib>
2+
using namespace metal;
3+
4+
typedef struct
5+
{
6+
float4 position [[position]];
7+
8+
float2 textureCoordinate [[user(textureCoordinate)]];
9+
float2 leftTextureCoordinate [[user(leftTextureCoordinate)]];
10+
float2 rightTextureCoordinate [[user(rightTextureCoordinate)]];
11+
float2 topTextureCoordinate [[user(topTextureCoordinate)]];
12+
float2 bottomTextureCoordinate [[user(bottomTextureCoordinate)]];
13+
} SharpenVertexIO;
14+
15+
16+
17+
vertex SharpenVertexIO sharpenVertex(const device packed_float2 *position [[buffer(0)]],
18+
const device packed_float2 *textureCoordinate [[buffer(1)]],
19+
uint vid [[vertex_id]])
20+
{
21+
SharpenVertexIO outputVertices;
22+
23+
outputVertices.position = float4(position[vid], 0, 1.0);
24+
25+
float2 widthStep = float2(1.0, 0.0);
26+
float2 heightStep = float2(0.0, 1.0);
27+
28+
outputVertices.textureCoordinate = textureCoordinate[vid];
29+
outputVertices.leftTextureCoordinate = textureCoordinate[vid] - widthStep;
30+
outputVertices.rightTextureCoordinate = textureCoordinate[vid] + widthStep;
31+
outputVertices.topTextureCoordinate = textureCoordinate[vid] + heightStep;
32+
outputVertices.bottomTextureCoordinate = textureCoordinate[vid] - heightStep;
33+
34+
return outputVertices;
35+
}
36+
37+
38+
// Vertex Shader
39+
/*
40+
attribute vec4 position;
41+
attribute vec4 inputTextureCoordinate;
42+
43+
uniform float texelWidth;
44+
uniform float texelHeight;
45+
uniform float sharpness;
46+
47+
varying vec2 textureCoordinate;
48+
varying vec2 leftTextureCoordinate;
49+
varying vec2 rightTextureCoordinate;
50+
varying vec2 topTextureCoordinate;
51+
varying vec2 bottomTextureCoordinate;
52+
53+
varying float centerMultiplier;
54+
varying float edgeMultiplier;
55+
56+
void main()
57+
{
58+
gl_Position = position;
59+
60+
vec2 widthStep = vec2(texelWidth, 0.0);
61+
vec2 heightStep = vec2(0.0, texelHeight);
62+
63+
textureCoordinate = inputTextureCoordinate.xy;
64+
leftTextureCoordinate = inputTextureCoordinate.xy - widthStep;
65+
rightTextureCoordinate = inputTextureCoordinate.xy + widthStep;
66+
topTextureCoordinate = inputTextureCoordinate.xy + heightStep;
67+
bottomTextureCoordinate = inputTextureCoordinate.xy - heightStep;
68+
69+
centerMultiplier = 1.0 + 4.0 * sharpness;
70+
edgeMultiplier = sharpness;
71+
}
72+
73+
*/
74+
75+
typedef struct {
76+
float sharpness;
77+
} SharpenUniform;
78+
79+
fragment half4 sharpenFragment(SharpenVertexIO fragmentInput [[stage_in]],
80+
texture2d<half> inputTexture [[texture(0)]],
81+
constant SharpenUniform& uniform [[buffer(1)]])
82+
{
83+
constexpr sampler quadSampler(coord::pixel);
84+
half3 centerColor = inputTexture.sample(quadSampler, fragmentInput.textureCoordinate).rgb;
85+
half3 leftColor = inputTexture.sample(quadSampler, fragmentInput.leftTextureCoordinate).rgb;
86+
half3 rightColor = inputTexture.sample(quadSampler, fragmentInput.rightTextureCoordinate).rgb;
87+
half3 topColor = inputTexture.sample(quadSampler, fragmentInput.topTextureCoordinate).rgb;
88+
half3 bottomColor = inputTexture.sample(quadSampler, fragmentInput.bottomTextureCoordinate).rgb;
89+
90+
half edgeMultiplier = half(uniform.sharpness);
91+
half centerMultiplier = 1.0 + 4.0 * edgeMultiplier;
92+
93+
return half4((centerColor * centerMultiplier
94+
- (leftColor * edgeMultiplier + rightColor * edgeMultiplier+ topColor * edgeMultiplier + bottomColor * edgeMultiplier)),
95+
inputTexture.sample(quadSampler, fragmentInput.bottomTextureCoordinate).w);
96+
97+
}
98+
// Fragment Shader
99+
/*
100+
varying vec2 textureCoordinate;
101+
varying vec2 leftTextureCoordinate;
102+
varying vec2 rightTextureCoordinate;
103+
varying vec2 topTextureCoordinate;
104+
varying vec2 bottomTextureCoordinate;
105+
106+
varying float centerMultiplier;
107+
varying float edgeMultiplier;
108+
109+
uniform sampler2D inputImageTexture;
110+
111+
void main()
112+
{
113+
vec3 textureColor = texture2D(inputImageTexture, textureCoordinate).rgb;
114+
vec3 leftTextureColor = texture2D(inputImageTexture, leftTextureCoordinate).rgb;
115+
vec3 rightTextureColor = texture2D(inputImageTexture, rightTextureCoordinate).rgb;
116+
vec3 topTextureColor = texture2D(inputImageTexture, topTextureCoordinate).rgb;
117+
vec3 bottomTextureColor = texture2D(inputImageTexture, bottomTextureCoordinate).rgb;
118+
119+
gl_FragColor = vec4((textureColor * centerMultiplier - (leftTextureColor * edgeMultiplier + rightTextureColor * edgeMultiplier + topTextureColor * edgeMultiplier + bottomTextureColor * edgeMultiplier)), texture2D(inputImageTexture, bottomTextureCoordinate).w);
120+
}
121+
122+
*/

0 commit comments

Comments
 (0)