Ios GPUImage2:将gl纹理传递给着色器
我试图修改GPUImage2十字线生成器,用UIImage制作的gl纹理替换默认十字线,我的图像是128x128 png文件 我正在使用GPUImage2 PictureInput将UIImage转换为gl纹理,它返回PictureInput的实例,没有任何问题/警告 接下来,我将修改CrosshairVertexShader以添加对新纹理的支持:Ios GPUImage2:将gl纹理传递给着色器,ios,xcode,opengl-es,gpuimage,Ios,Xcode,Opengl Es,Gpuimage,我试图修改GPUImage2十字线生成器,用UIImage制作的gl纹理替换默认十字线,我的图像是128x128 png文件 我正在使用GPUImage2 PictureInput将UIImage转换为gl纹理,它返回PictureInput的实例,没有任何问题/警告 接下来,我将修改CrosshairVertexShader以添加对新纹理的支持: uniform sampler2D inputImageTexture; attribute vec4 position; varying vec
uniform sampler2D inputImageTexture;
attribute vec4 position;
varying vec2 centerLocation;
varying float pointSpacing;
void main() {
gl_Position = vec4(((position.xy * 2.0) - 1.0), 0.0, 1.0);
gl_PointSize = crosshairWidth + 1.0;
pointSpacing = 1.0 / crosshairWidth;
centerLocation = vec2(
pointSpacing * ceil(crosshairWidth / 2.0),
pointSpacing * ceil(crosshairWidth / 2.0));
}
然后将其传递到修改的CrosshairFragmentShader并在屏幕上渲染(?):
下面是修改后的CrosshairGenerator的代码:
import UIKit
public class CrosshairGenerator: ImageGenerator {
public var crosshairWidth:Float = 5.0 { didSet { uniformSettings["crosshairWidth"] = crosshairWidth } }
public var crosshairColor:Color = Color.green { didSet { uniformSettings["crosshairColor"] = crosshairColor } }
public var crosshairImage: PictureInput = PictureInput(imageName:"monohrome.png") {
didSet {
uniformSettings["inputImageTexture"] = crosshairImage //Here I pass the texture to shader?
crosshairImage.processImage()
}
}
let crosshairShader:ShaderProgram
var uniformSettings = ShaderUniformSettings()
public override init(size:Size) {
crosshairShader = crashOnShaderCompileFailure("CrosshairGenerator"){try sharedImageProcessingContext.programForVertexShader(vertexShader, fragmentShader: fragmentShader)}
super.init(size:size)
({crosshairWidth = 5.0})()
({crosshairColor = Color.green})()
({crosshairImage = PictureInput(imageName:"monohrome.png")})()
}
public func renderCrosshairs(_ positions:[Position]) {
imageFramebuffer.activateFramebufferForRendering()
imageFramebuffer.timingStyle = .stillImage
#if GL
glEnable(GLenum(GL_POINT_SPRITE))
glEnable(GLenum(GL_VERTEX_PROGRAM_POINT_SIZE))
#else
glEnable(GLenum(GL_POINT_SPRITE_OES))
#endif
crosshairShader.use()
uniformSettings.restoreShaderSettings(crosshairShader)
clearFramebufferWithColor(Color.transparent)
guard let positionAttribute = crosshairShader.attributeIndex("position") else { fatalError("A position attribute was missing from the shader program during rendering.") }
let convertedPositions = positions.flatMap{$0.toGLArray()}
glVertexAttribPointer(positionAttribute, 2, GLenum(GL_FLOAT), 0, 0, convertedPositions)
glDrawArrays(GLenum(GL_POINTS), 0, GLsizei(positions.count))
notifyTargets()
}
}
拐角检测器的初始化保持不变:
FilterOperation(
filter:{HarrisCornerDetector()},
listName:"Harris corner detector",
titleName:"Harris Corner Detector",
sliderConfiguration:.enabled(minimumValue:0.01, maximumValue:0.70, initialValue:0.20),
sliderUpdateCallback: {(filter, sliderValue) in
filter.threshold = sliderValue
},
filterOperationType:.custom(filterSetupFunction:{(camera, filter, outputView) in
let castFilter = filter as! HarrisCornerDetector
// TODO: Get this more dynamically sized
#if os(iOS)
let crosshairGenerator = CrosshairGenerator(size:Size(width:480, height:640))
#else
let crosshairGenerator = CrosshairGenerator(size:Size(width:1280, height:720))
#endif
crosshairGenerator.crosshairWidth = 30.0
castFilter.cornersDetectedCallback = { corners in
crosshairGenerator.renderCrosshairs(corners)
}
camera --> castFilter
let blendFilter = AlphaBlend()
camera --> blendFilter --> outputView
crosshairGenerator --> blendFilter
return blendFilter
})
)
代码编译并运行良好,但在屏幕上渲染时纹理看起来是空的(彩色方块):
uniform sampler2D inputImageTexture;
varying lowp vec3 crosshairColor;
varying highp vec2 centerLocation;
varying highp float pointSpacing;
void main() {
highp vec4 tex = texture2D(inputImageTexture, centerLocation);
gl_FragColor = vec4(tex.r, tex.g, tex.b, tex.a);
}
如果我注释掉这一行-uniformSettings[“inputImageTexture”]=crosshairImage-结果保持不变,这让我觉得纹理根本没有传递给着色器
我在这里遗漏了什么?嘿,你找到解决方案了吗?@AbhishekDave我最终在自定义着色器中绘制,而不是使用导入的纹理。帮助我实现了这一目标。你好@FaridA。我也无法用我的星图替换这个红色十字线,你能帮我吗,我不知道opengles和着色器,你能在我的邮件id:badri上发送代码片段吗。vk@gmail.com. 请帮忙