好不容易找到的Insta的经典滤镜源码,贴出来帮大家学习。

//
// IFImageFilter.m
// InstaFilters
//
// Created by Di Wu on 2/28/12.
// Copyright (c) 2012 twitter:@diwup. All rights reserved.
// #import "IFImageFilter.h" @interface IFImageFilter ()
{
GLint filterPositionAttribute, filterTextureCoordinateAttribute;
GLint filterInputTextureUniform, filterInputTextureUniform2, filterInputTextureUniform3, filterInputTextureUniform4, filterInputTextureUniform5, filterInputTextureUniform6; GLuint filterFramebuffer;
} @end @implementation IFImageFilter - (id)initWithFragmentShaderFromString:(NSString *)fragmentShaderString;
{
if (!(self = [super init]))
{
return nil;
} [GPUImageOpenGLESContext useImageProcessingContext];
filterProgram = [[GLProgram alloc] initWithVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:fragmentShaderString]; [filterProgram addAttribute:@"position"];
[filterProgram addAttribute:@"inputTextureCoordinate"]; if (![filterProgram link])
{
NSString *progLog = [filterProgram programLog];
NSLog(@"Program link log: %@", progLog);
NSString *fragLog = [filterProgram fragmentShaderLog];
NSLog(@"Fragment shader compile log: %@", fragLog);
NSString *vertLog = [filterProgram vertexShaderLog];
NSLog(@"Vertex shader compile log: %@", vertLog);
filterProgram = nil;
NSAssert(NO, @"Filter shader link failed");
} filterPositionAttribute = [filterProgram attributeIndex:@"position"];
filterTextureCoordinateAttribute = [filterProgram attributeIndex:@"inputTextureCoordinate"];
filterInputTextureUniform = [filterProgram uniformIndex:@"inputImageTexture"]; // This does assume a name of "inputImageTexture" for the fragment shader
filterInputTextureUniform2 = [filterProgram uniformIndex:@"inputImageTexture2"]; // This does assume a name of "inputImageTexture2" for second input texture in the fragment shader
filterInputTextureUniform3 = [filterProgram uniformIndex:@"inputImageTexture3"]; // This does assume a name of "inputImageTexture3" for second input texture in the fragment shader
filterInputTextureUniform4 = [filterProgram uniformIndex:@"inputImageTexture4"]; // This does assume a name of "inputImageTexture4" for second input texture in the fragment shader
filterInputTextureUniform5 = [filterProgram uniformIndex:@"inputImageTexture5"]; // This does assume a name of "inputImageTexture5" for second input texture in the fragment shader
filterInputTextureUniform6 = [filterProgram uniformIndex:@"inputImageTexture6"]; // This does assume a name of "inputImageTexture6" for second input texture in the fragment shader [filterProgram use];
glEnableVertexAttribArray(filterPositionAttribute);
glEnableVertexAttribArray(filterTextureCoordinateAttribute);
NSLog(@".0.0.0%@",NSStringFromCGSize(inputTextureSize)); return self;
} - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates;
{
NSLog(@".0.0.0%@",NSStringFromCGSize(inputTextureSize)); [GPUImageOpenGLESContext useImageProcessingContext];
[self setFilterFBO]; [filterProgram use]; glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, filterSourceTexture); glUniform1i(filterInputTextureUniform, ); if (filterSourceTexture2 != )
{
glActiveTexture(GL_TEXTURE3);
glBindTexture(GL_TEXTURE_2D, filterSourceTexture2); glUniform1i(filterInputTextureUniform2, );
}
if (filterSourceTexture3 != )
{
glActiveTexture(GL_TEXTURE4);
glBindTexture(GL_TEXTURE_2D, filterSourceTexture3);
glUniform1i(filterInputTextureUniform3, );
}
if (filterSourceTexture4 != )
{
glActiveTexture(GL_TEXTURE5);
glBindTexture(GL_TEXTURE_2D, filterSourceTexture4);
glUniform1i(filterInputTextureUniform4, );
}
if (filterSourceTexture5 != )
{
glActiveTexture(GL_TEXTURE6);
glBindTexture(GL_TEXTURE_2D, filterSourceTexture5);
glUniform1i(filterInputTextureUniform5, );
}
if (filterSourceTexture6 != )
{
glActiveTexture(GL_TEXTURE7);
glBindTexture(GL_TEXTURE_2D, filterSourceTexture6);
glUniform1i(filterInputTextureUniform6, );
} glVertexAttribPointer(filterPositionAttribute, , GL_FLOAT, , , vertices);
glVertexAttribPointer(filterTextureCoordinateAttribute, , GL_FLOAT, , , textureCoordinates); glDrawArrays(GL_TRIANGLE_STRIP, , ); for (id<GPUImageInput> currentTarget in targets)
{
[currentTarget setInputSize:inputTextureSize];
[currentTarget newFrameReady];
}
} - (void)setFilterFBO;
{
if (!filterFramebuffer)
{
[self createFilterFBO];
} glBindFramebuffer(GL_FRAMEBUFFER, filterFramebuffer); CGSize currentFBOSize = [self sizeOfFBO];
glViewport(, , (int)currentFBOSize.width, (int)currentFBOSize.height);
} - (void)createFilterFBO;
{
glActiveTexture(GL_TEXTURE1);
glGenFramebuffers(, &filterFramebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, filterFramebuffer);
NSLog(@".0.0.0%@",NSStringFromCGSize(inputTextureSize));
CGSize currentFBOSize = [self sizeOfFBO];
// NSLog(@"Filter size: %f, %f", currentFBOSize.width, currentFBOSize.height); glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8_OES, (int)currentFBOSize.width, (int)currentFBOSize.height);
glBindTexture(GL_TEXTURE_2D, outputTexture);
glTexImage2D(GL_TEXTURE_2D, , GL_RGBA, (int)currentFBOSize.width, (int)currentFBOSize.height, , GL_RGBA, GL_UNSIGNED_BYTE, );
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, outputTexture, ); GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); NSAssert(status == GL_FRAMEBUFFER_COMPLETE, @"Incomplete filter FBO: %d", status);
} - (CGSize)sizeOfFBO;
{
CGSize outputSize = [self maximumOutputSize];
if ( (CGSizeEqualToSize(outputSize, CGSizeZero)) || (inputTextureSize.width < outputSize.width) )
{
return inputTextureSize;
}
else
{
return outputSize;
}
} - (void)setInputTexture:(GLuint)newInputTexture atIndex:(NSInteger)textureIndex;
{
if (textureIndex == )
{
filterSourceTexture = newInputTexture;
}
else if (filterSourceTexture2 == )
{
filterSourceTexture2 = newInputTexture;
}
else if (filterSourceTexture3 == ) {
filterSourceTexture3 = newInputTexture;
}
else if (filterSourceTexture4 == ) {
filterSourceTexture4 = newInputTexture;
}
else if (filterSourceTexture5 == ) {
filterSourceTexture5 = newInputTexture;
}
else if (filterSourceTexture6 == ) {
filterSourceTexture6 = newInputTexture;
} } @end

效果图

百度网盘下载http://pan.baidu.com/s/1c04sFTY

insta经典滤镜下载的更多相关文章

  1. c++学习书籍推荐《Visual C++2008入门经典》下载

    百度云及其他网盘下载地址:点我 <Visual C++2008入门经典>学习目标: 使用标准模板库(STL)来组织和操作本地C++程序中的数据 C++程序调试技术 构造Microsoft ...

  2. Ruby On Rails经典书籍下载地址

    Web开发敏捷之道-应用Rails进行敏捷Web开发   http://vdisk.weibo.com/s/t47M5Q3WInwc RUBY ON RAILS入门经典   http://downlo ...

  3. 经典书籍---MySQL经典书籍下载

    以下是一些经典的MySQL书籍电子版,括号内为提取码,若需自取. 欢迎阅读纸质版,尊重作者版权 高性能MySQL_中文版 [ hre3 ] 高性能MySQL_英文版[ m2xj ] MySQL技术内幕 ...

  4. C# NOPI 项目实战(经典)(可下载项目源码)

    1 -.首先说明下项目目的: 之前我有写过一篇  "NPOI操作EXCEL" 这篇文章主要介绍了如何安装NPOI,以及NPOI具体如何使用,并且用具体实例介绍了excel导入到da ...

  5. VC++/MFC(VC6)开发技术精品学习资料下载汇总

    工欲善其事,必先利其器,VC开发MFC Windows程序,Visual C++或Visual Studio是必须的,恩,这里都给你总结好了,拿去吧:VC/MFC开发必备Visual C++.Visu ...

  6. Java--使用多线程下载,断点续传技术原理(RandomAccessFile)

    一.基础知识 1.什么是线程?什么是进程?它们之间的关系? 可以参考之前的一篇文章:java核心知识点学习----并发和并行的区别,进程和线程的区别,如何创建线程和线程的四种状态,什么是线程计时器 简 ...

  7. Spring学习笔记下载

    动力节点的spring视频教程相当的经典:下载地址 https://pan.baidu.com/s/1eTSOaae

  8. iOS二十种超酷时尚艺术滤镜汇总【附源码】

    本文总结了20种ios滤镜都是基于GPUImage的,有3种滤镜是GPUImage库中包含的,还有17种是Instagram中的经典滤镜,集成在一个项目中.使用GPUImage可以非常容易创建我们自己 ...

  9. C++学习网站总结(转)

    总结帖: http://club.topsage.com/thread-361504-1-1.html Visual C++ (VC) / MFC 电子书下载: Visual C++ 2008 入门经 ...

随机推荐

  1. 搭建基于crtmpserver的点播解决方案

    1. linux环境下build并启动crtmpserver 这部分可以参见我写的专项详解文章 <crtmpserver流媒体服务器的介绍与搭建> 和 <crtmpserver配置文 ...

  2. In-Place upgrade to Team Foundation Server (TFS) 2015 from TFS 2013Team Foundation Server TFS TFS 2015 TFS upgrade TFS with Sharepoint

    This upgrade document gives detailed step by step procedure for the In-Place upgrade from TFS 2013 t ...

  3. iOS中使用RegexKitLite来试用正则表达式

    转:http://blog.csdn.net/nullcn/article/details/6338592 准备工作,下载RegexKitLite 软件包,解压后有2个文件,需要加载到project中 ...

  4. 迭代dict的key和value

    我们了解了如何迭代 dict 的key和value,那么,在一个 for 循环中,能否同时迭代 key和value?答案是肯定的. 首先,我们看看 dict 对象的 items() 方法返回的值: & ...

  5. <c:otherwise>

    <c:if>没有<c:else>可以用<c:choose>来取代结构:<c:choose> <c:when test=""&g ...

  6. git推送tag到远端服务器

    git推送tag到远端服务器 默认情况下,git push并不会把tag标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库.1.push单个tag,命令格式为:git push origi ...

  7. 使用VMWare虚拟机创建CentOS版本号的Linux学习环境(每一步都有截图与说明)

    学习Android开发.假设不学习Linux的基本使用,总感觉心里过意不去,由于毕竟Android还是搭载在Linux的基础之上的. 因此.学习一种Linux系统的基本操作.对我们以后的学习还是非常有 ...

  8. 详细解释如何通过Android自带的方式来实现图片的裁剪——原理分析+解决方案

    我们很多时候需要进行图片的裁剪,其实这个功能在android系统中已经有一套解决方案了,虽然界面和效果并不是很优秀但功能毫无疑问是完美实现了.至于,不用自带的方案怎么做自定义,这个就是后话了.本篇主要 ...

  9. Svg.Js A标签,链接操作

    一.创建a标签,为a标签添加内容 <div id="svg1"></div> <script> //SVG.A 链接创建 var draw = ...

  10. 轻松看懂Java字节码

    java字节码 计算机只认识0和1.这意味着任何语言编写的程序最终都需要经过编译器编译成机器码才能被计算机执行.所以,我们所编写的程序在不同的平台上运行前都要经过重新编译才能被执行. 而Java刚诞生 ...