OpenGL-ES: селективное смешивание - PullRequest
0 голосов
/ 03 мая 2018

Я использую детектор углов GPUImage для извлечения углов из кадров, снятых камерой. Я хотел бы сделать блестки по углам координат. Когда у меня есть координаты углов, я передаю их своему генератору блесток (очень похоже на генератор перекрестия в GPUImage):

public func renderSparkles(_ positions:[Position]) {
    imageFramebuffer.activateFramebufferForRendering()
    imageFramebuffer.timingStyle = .stillImage

    glEnable(GLenum(GL_POINT_SPRITE_OES))

    sparklesShader.use()
    uniformSettings.restoreShaderSettings(sparklesShader)

    clearFramebufferWithColor(Color.transparent)

    guard let positionAttribute = sparklesShader.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()
}

В фрагментном шейдере генератора я рисую искру в координате угла:

uniform lowp vec3 crosshairColor; 
varying highp vec2 centerLocation;

void main()
{
   lowp vec2 distanceFromCenter = abs(centerLocation - gl_PointCoord.xy);

   lowp float r = length(distanceFromCenter)*0.042; 
   lowp float a = atan(distanceFromCenter.y,distanceFromCenter.x);      
   lowp float f = abs(cos(a*2.0))*0.100*-0.322/0.224;
   lowp float b = abs(cos(a*2.0))*0.078*-0.882/17.088;
   lowp float c = abs(cos(a*2.0))*0.030*-0.178*0.688;

   lowp vec4 color = vec4(1.0-smoothstep(f,b+0.04,r)) + vec4(1.0-smoothstep(b,c+0.02,r/0.644)) + vec4(1.0-smoothstep(b,c+0.011,r/0.764));
   gl_FragColor = color;
}

Вот пример вывода, который у меня есть

Как я могу смешать блестки?

1 Ответ

0 голосов
/ 09 мая 2018

В случае, если кто-то найдет это полезным, вот код метода рендеринга sparkles, основанный на предложении Rabbid76:

public func renderSparkles(_ positions:[Position]) {
    imageFramebuffer.activateFramebufferForRendering()
    imageFramebuffer.timingStyle = .stillImage

    glEnable(GLenum(GL_POINT_SPRITE_OES))

    glEnable(GLenum(GL_BLEND))
    glBlendFunc(GLenum(GL_SRC_ALPHA),GLenum(GL_ONE_MINUS_CONSTANT_ALPHA))

    sparklesShader.use()
    uniformSettings.restoreShaderSettings(sparklesShader)

    clearFramebufferWithColor(Color.transparent)

    guard let positionAttribute = sparklesShader.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()   
}
...