-
Notifications
You must be signed in to change notification settings - Fork 615
Description
When create a simple effect like
let testImage = UIImage(named:"cat.jpg")!
let unsharpMask = UnsharpMask()
unsharpMask.blurRadiusInPixels = 5
unsharpMask.intensity = 2.5
let filteredImage = testImage.filterWithOperation(unsharpMask)
within Xcode 12.4 and swift5 I got an fatalError with shader compilation error:
Compile log: ERROR: 0:2: 'float' : declaration must include a precision qualifier for type
ERROR: 0:3: 'float' : declaration must include a precision qualifier for type
ERROR: 0:5: 'vec2[7]' : declaration must include a precision qualifier for type
ERROR: 0:9: 'vec4' : declaration must include a precision qualifier for type
ERROR: 0:10: Use of undeclared identifier 'sum'
ERROR: 0:10: Use of undeclared identifier 'blurCoordinates'
ERROR: 0:11: Use of undeclared identifier 'sum'
ERROR: 0:11: Use of undeclared identifier 'blurCoordinates'
ERROR: 0:12: Use of undeclared identifier 'sum'
ERROR: 0:12: Use of undeclared identifier 'blurCoordinates'
ERROR: 0:13: Use of undeclared identifier 'sum'
ERROR: 0:13: Use of undeclared identifier 'blurCoordinates'
ERROR: 0:14: Use of undeclared identifier 'sum'
ERROR: 0:14: Use of undeclared identifier 'blurCoordinates'
ERROR: 0:15: Use of undeclared identifier 'sum'
ERROR: 0:15: Use of undeclared identifier 'blurCoordinates'
ERROR: 0:16: Use of undeclared identifier 'sum'
ERROR: 0:16: Use of undeclared identifier 'blurCoordinates'
ERROR: 0:17: Use of undeclared identifier 'sum'
Shader deallocated --> ShaderProgram.swift: deinit: 64
ERROR: GaussianBlur compilation failed with error: ShaderCompileError(compileLog: "Fragment shader compile error:")
Fatal error: Aborting execution.: file GPUImage/ShaderProgram.swift, line 253
2021-04-14 14:09:41.961013+0300 gpuImage2tests[94267:692420] Fatal error: Aborting execution.: file GPUImage/ShaderProgram.swift, line 253
looks like shaders needs to be modified a bit by adding required precision. I added highp
for some values and looks like this solve the issue, but better if @BradLarson u can check this issue.
example of modified shader:
func vertexShaderForStandardGaussianBlurOfRadius(_ radius:UInt, sigma:Double) -> String {
guard (radius > 0) else { return OneInputVertexShader }
let numberOfBlurCoordinates = radius * 2 + 1
var shaderString = "#version 310 es \n attribute highp vec4 position;\n attribute highp vec4 inputTextureCoordinate;\n \n uniform highp float texelWidth;\n uniform highp float texelHeight;\n \n varying highp vec2 blurCoordinates[\(numberOfBlurCoordinates)];\n \n void main()\n {\n gl_Position = position;\n \n highp vec2 singleStepOffset = vec2(texelWidth, texelHeight);\n"
for currentBlurCoordinateIndex in 0..<numberOfBlurCoordinates {
let offsetFromCenter = Int(currentBlurCoordinateIndex) - Int(radius)
if (offsetFromCenter < 0) {
shaderString += "blurCoordinates[\(currentBlurCoordinateIndex)] = inputTextureCoordinate.xy - singleStepOffset * \(Float(-offsetFromCenter));\n"
} else if (offsetFromCenter > 0) {
shaderString += "blurCoordinates[\(currentBlurCoordinateIndex)] = inputTextureCoordinate.xy + singleStepOffset * \(Float(offsetFromCenter));\n"
} else {
shaderString += "blurCoordinates[\(currentBlurCoordinateIndex)] = inputTextureCoordinate.xy;\n"
}
}
shaderString += "}\n"
return shaderString
}