Ios GPUImage2:将gl纹理传递给着色器

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

我试图修改GPUImage2十字线生成器,用UIImage制作的gl纹理替换默认十字线,我的图像是128x128 png文件

我正在使用GPUImage2 PictureInput将UIImage转换为gl纹理,它返回PictureInput的实例,没有任何问题/警告

接下来,我将修改CrosshairVertexShader以添加对新纹理的支持:

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. 请帮忙