GPUImage源码解读(八)

基于Simulink的PR(比例谐振)控制器在单相整流中的应用 本文详细介绍了基于Simulink的单相整流系统中PR(比例谐振)控制器的设计与实现方法。首先阐述了PR控制器相较于传统PI控制器的优势,能够有效消除交流信号跟踪中的稳态误差。接着系统讲解了PR控制器的传递函数原理、实用型设计(带带宽)及参数整定方法。通过Simulink建模步骤,包括主功率电路搭建、电压外环PI设计、电流指令生成、PR控制器实现(推荐MATLAB Function方法)和SPWM调制等关键环节。仿真对比显示PR控制在电流跟踪精度(THD仅1.9%)、功率因数(0.998)和动态响应(突变恢 阅读详情
GPUImageView

从名称就可以知道GPUImageView是GPUImage框架中显示图片相关的类。GPUImageView实现了GPUImageInput协议,从而可以知道它能够接受GPUImageFramebuffer的输入。因此,常常作为响应链的终端节点,用于显示处理后的帧缓存。

- 重写静态方法 返回 CAEAGLLayer

GPUImageView 是UIView的子类,所以会有UIView所有方法特性。UIView也可以使用不同的CALayer来显示,添加OpenGL ES实现View绘制的使用


- (Class)layerClass
{

return [CAEAGLLayer class];
}
初始化 方法

最后都会调用 commonInit 方法


- (id)initWithFrame:(CGRect)frame;

- (id)initWithCoder:(NSCoder *)coder;

实现方法


- (void)commonInit;
{

// Set scaling to account for Retina display

if ([self respondsToSelector:@selector(setContentScaleFactor:)])

{

    self.contentScaleFactor = [[UIScreen mainScreen] scale];

}



inputRotation = kGPUImageNoRotation;

self.opaque = YES;

self.hidden = NO;

//1,设置OpenGL ES的相关属性

CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;

eaglLayer.opaque = YES;

eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil];



self.enabled = YES;



runSynchronouslyOnVideoProcessingQueue(^{

    [GPUImageContext useImageProcessingContext];



    //2、创建着色器程序;

    displayProgram = [[GPUImageContext sharedImageProcessingContext] programForVertexShaderString:kGPUImageVertexShaderString fragmentShaderString:kGPUImagePassthroughFragmentShaderString];

    if (!displayProgram.initialized)

    {

        //3、获取属性变量、统一变量的位置

        [displayProgram addAttribute:@"position"];

        [displayProgram addAttribute:@"inputTextureCoordinate"];



        if (![displayProgram link])

        {

            NSString *progLog = [displayProgram programLog];

            NSLog(@"Program link log: %@", progLog);

            NSString *fragLog = [displayProgram fragmentShaderLog];

            NSLog(@"Fragment shader compile log: %@", fragLog);

            NSString *vertLog = [displayProgram vertexShaderLog];

            NSLog(@"Vertex shader compile log: %@", vertLog);

            displayProgram = nil;

            NSAssert(NO, @"Filter shader link failed");

        }

    }



    displayPositionAttribute = [displayProgram attributeIndex:@"position"];

    displayTextureCoordinateAttribute = [displayProgram attributeIndex:@"inputTextureCoordinate"];

    displayInputTextureUniform = [displayProgram uniformIndex:@"inputImageTexture"]; // This does assume a name of "inputTexture" for the fragment shader



    [GPUImageContext setActiveShaderProgram:displayProgram];

    glEnableVertexAttribArray(displayPositionAttribute);

    glEnableVertexAttribArray(displayTextureCoordinateAttribute);

    //4、设置清屏颜色

    [self setBackgroundColorRed:0.0 green:0.0 blue:0.0 alpha:1.0];

    _fillMode = kGPUImageFillModePreserveAspectRatio;

    //5、创建默认的帧缓存、渲染缓存,用于图像的显示

    [self createDisplayFramebuffer];

});
}

方法列表

// 设置背景颜色
- (void)setBackgroundColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent alpha:(GLfloat)alphaComponent;
// 该方法未实现

(void)setCurrentlyReceivingMonochromeInput:(BOOL)newValue;

实现方法


// 根据旋转模式获取纹理坐标

- (const GLfloat *)textureCoordinatesForRotation:(GPUImageRotationMode)rotationMode;
{

// static const GLfloat noRotationTextureCoordinates[] = {

// 0.0f, 0.0f,

// 1.0f, 0.0f,

// 0.0f, 1.0f,

// 1.0f, 1.0f,

// };

static const GLfloat noRotationTextureCoordinates[] = {

    0.0f, 1.0f,

    1.0f, 1.0f,

    0.0f, 0.0f,

    1.0f, 0.0f,

};



static const GLfloat rotateRightTextureCoordinates[] = {

    1.0f, 1.0f,

    1.0f, 0.0f,

    0.0f, 1.0f,

    0.0f, 0.0f,

};



static const GLfloat rotateLeftTextureCoordinates[] = {

    0.0f, 0.0f,

    0.0f, 1.0f,

    1.0f, 0.0f,

    1.0f, 1.0f,

};



static const GLfloat verticalFlipTextureCoordinates[] = {

    0.0f, 0.0f,

    1.0f, 0.0f,

    0.0f, 1.0f,

    1.0f, 1.0f,

};



static const GLfloat horizontalFlipTextureCoordinates[] = {

    1.0f, 1.0f,

    0.0f, 1.0f,

    1.0f, 0.0f,

    0.0f, 0.0f,

};



static const GLfloat rotateRightVerticalFlipTextureCoordinates[] = {

    1.0f, 0.0f,

    1.0f, 1.0f,

    0.0f, 0.0f,

    0.0f, 1.0f,

};



static const GLfloat rotateRightHorizontalFlipTextureCoordinates[] = {

    1.0f, 1.0f,

    1.0f, 0.0f,

    0.0f, 1.0f,

    0.0f, 0.0f,

};



static const GLfloat rotate180TextureCoordinates[] = {

    1.0f, 0.0f,

    0.0f, 0.0f,

    1.0f, 1.0f,

    0.0f, 1.0f,

};



switch(rotationMode)

{

    case kGPUImageNoRotation: return noRotationTextureCoordinates;

    case kGPUImageRotateLeft: return rotateLeftTextureCoordinates;

    case kGPUImageRotateRight: return rotateRightTextureCoordinates;

    case kGPUImageFlipVertical: return verticalFlipTextureCoordinates;

    case kGPUImageFlipHorizonal: return horizontalFlipTextureCoordinates;

    case kGPUImageRotateRightFlipVertical: return rotateRightVerticalFlipTextureCoordinates;

    case kGPUImageRotateRightFlipHorizontal: return rotateRightHorizontalFlipTextureCoordinates;

    case kGPUImageRotate180: return rotate180TextureCoordinates;

}
}

// 覆盖父类的方法,作用是负责OpenGL的图形绘制,并显示在屏幕上

- (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex;
{

runSynchronouslyOnVideoProcessingQueue(^{

    [GPUImageContext setActiveShaderProgram:displayProgram];

    [self setDisplayFramebuffer];



    // 清屏

    glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha);

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);



    glActiveTexture(GL_TEXTURE4);

    glBindTexture(GL_TEXTURE_2D, [inputFramebufferForDisplay texture]);

    glUniform1i(displayInputTextureUniform, 4);



    glVertexAttribPointer(displayPositionAttribute, 2, GL_FLOAT, 0, 0, imageVertices);

    glVertexAttribPointer(displayTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, [GPUImageView textureCoordinatesForRotation:inputRotation]);



    // 绘制

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);



    // 显示

    [self presentFramebuffer];

    [inputFramebufferForDisplay unlock];

    inputFramebufferForDisplay = nil;

});
}

// 显示帧缓存

- (void)presentFramebuffer;
{

glBindRenderbuffer(GL_RENDERBUFFER, displayRenderbuffer);

[[GPUImageContext sharedImageProcessingContext] presentBufferForDisplay];
}
【Simulink教程案例7】基于Simulink的滑模控制器设计与实现 欢迎订阅滑膜控制是一种变结构控制策略,其和常规控制方法的主要区别在于控制的不连续性,即一种使系统结构随时间变化的开关特性。所以,滑膜控制器也叫做变结构控制器,其本质是一类特殊的非线性控制器,并且这种非线性为不连续性。滑膜控制器和其他控制方式最大的区别在于其结构的不固定性,在其工作过程中,系统当前的状态会发生变化,使得系统按照预先设置的“滑动模态”的状态轨迹运动。正是由于这个特点,滑膜控制器具有快速响应的优点。滑模控制的基本定义如下所示:1).穿越切换面上的某个点;2).从切换面上的某个点离开; 阅读详情

相关推荐

【半桥LLC】半桥LLC谐振开环闭环软启动DCDC变换器的设计与仿真

本文详细分析了半桥LLC谐振DC-DC变换器的开环与闭环控制设计原理,重点探讨了软启动功能的实现。通过仿真验证,展示了开环与闭环情况下的电压输出差异以及系统效率的提升。该研究为提高DC-DC变换器性能提供了参考。

2401_84610415的博客 2595

GPUImage 滤波算法详解

#import "GPUImageFilter.h" #import "GPUImagePicture.h" #import //GPUImage 源码详解 //顶点着色器 //vertex.shader //顶点着色器是一个可编程的处理单元,执行顶点变换、纹理坐标变换、光照、材质等顶点的相关操作,每顶点执行一次。替代了传统渲染管线中顶点变换、光照以及纹理坐标的处理,开发人员可以根据自己的

jeffasd的专栏 2885

告别网络卡顿!保姆级教程:用国内镜像源5分钟搞定ESP32开发环境(Arduino IDE)

本文提供了一份保姆级教程,教你如何利用国内镜像源在5分钟内快速搭建ESP32开发环境(Arduino IDE),告别网络卡顿问题。教程详细介绍了镜像源配置、开发板安装、测试程序烧录等步骤,并包含与巴法云对接的实战案例,帮助开发者高效完成物联网项目。

weixin_42536058的博客 589

GPUImage源码解读(十)

GPUImageVideoCamera继承自GPUImageOutput,实现了 AVCaptureVideoDataOutputSampleBufferDelegate 和 AVCaptureAudioDataOutputSampleBufferDelegate 协议。GPUImageVideoCamera可以调用相机进行视频拍摄,拍摄之后会生成帧缓存对象,我们可以使用GPUImageView显...

Philm_iOS的博客 726

ADS基础教程20 - 电磁仿真(EM)参数化仿真

一、引言二、参数化设置1.参数定义2.参数赋值3.创建EM模型和符号四、总结1)在Layout视图,菜单栏中选中EMComponent2)在弹出的参数编辑框中,采用标称/扰动()设计。使用子网(Subnetwork)参数。这些方法是互斥的,在为单个组件定义参数时不能将它们组合起来。标称/扰动(Nominal/Perturbed)参数使用平面化布局场景,并且只包含端口和原始图形形状(如多边形、矩形和圆形)时定义。

XZ_ZC的博客 4028

为分析表明卡诺电池技术(或热泵式储电技术)-是目前最佳的储能技术!!!-2021年

卡诺电池(Carnot Battery)是一种基于热力学循环的储能技术,其核心原理是通过热力循环将电能转化为热能存储,并在需要时将热能重新转换为电能输出。这种技术得名于热力学中的卡诺循环原理,由法国工程师卡诺于1824年提出。

qq_15963745的博客 655

GPUImage详细解析

http://www.jianshu.com/p/7a58a7a61f4c 从源码的角度分析、学习GPUImage和OpenGL ES,这是第一篇,介绍GPUImageFilter和 GPUImageFramebuffer。 OpenGL ES准备 回顾下我们之前的OpenGL ES教程,图像在OpenGL ES中的表示是纹理,会在片元着色器里面进行像素级别的处理。

xiaota00的博客 1229

FastAPI基础项目:仿头条新闻的web项目,实现基本的新闻列表页和详情页查看功能

该项目是一个基于FastAPI和MySQL的新闻应用入门项目。主要包含新闻列表页和详情页两个功能页面。项目结构清晰,包含主应用文件、数据库脚本和HTML模板。使用SQLAlchemy进行数据库操作,通过脚本可自动生成50条示例新闻数据。环境配置简单,仅需安装FastAPI、MySQL驱动等基础依赖,通过.env文件管理数据库连接。该项目适合作为FastAPI+MySQL的入门学习案例,展示了基本的CRUD操作、分页查询和模板渲染功能。

数据知道的博客 4427

GPUImage倒像

GPUImage镜像,前置摄像头横屏倒像,GPUImageView->GPUImageInput有设置镜像的方法: - (void)setInputRotation:(GPUImageRotationMode)newInputRotation atIndex:(NSInteger)textureIndex; 写一个方法,在初始化和旋转摄像头的时候调用,切换AVCaptureDevicePo...

竹毛言己 601

WPF用户控件间属性传递的艺术

本文详细介绍了WPF中父控件向子控件传递属性的方法。针对常见的绑定失效问题,重点讲解了使用RelativeSource绑定技术,通过指定AncestorType确保正确访问父控件属性。文章通过实例演示了从ParentModel传递属性到ChildUserControl依赖属性的完整实现过程,包括模型定义、XAML结构设计和代码实现。这种方法有效解决了数据上下文混淆问题,为WPF开发中的控件交互提供了可靠解决方案,有助于提升应用的灵活性和可维护性。

2501_90323865的博客 56

【ARM Trace32(劳特巴赫) 使用介绍 10 -- Trace32 scan dump 详细介绍】

将图 1-2 中扫描单元按照扫描移位模式连接起来,就构成了扫描测试中的基本结构,这里介绍下全扫描。全扫描就是多个扫描单元相连接,上一单元的扫描输出,连接到目前单元的扫描输入,目前单元的扫描输出连接到下一单元的扫描输入,以此类推,构成一条移位寄存器链,如图1-3 所示:图 1-3 全扫描这样的扫描结构,可通过一个串行输入端,将期望的数据存入移位寄存器链并观察运行结果。

CodingCos的博客 2033

GPUImage API 文档之GPUImageFilter类

GPUImageFilter类   方法   - (id)initWithVertexShaderFromString:(NSString *)vertexShaderString fragmentShaderFromString:(NSString *)fragmentShaderString   说明:使用顶点和片段着色字符串来初始化GPUImageFilter       - (i...

weixin_33720078的博客 287

AI之KE:Knowledge Engineering知识工程的简介、发展、应用案例之详细攻略

AI之KE:Knowledge Engineering知识工程的简介、发展、应用案例之详细攻略 目录 Knowledge Engineering知识工程的简介 0.1、What 0.2、How 0.3、Why 1、知识工程过程的5个活动 2、知识图谱的应用 Knowledge Engineering知识工程的发展 1、前知识工程时期——1950-1970时期:图...

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 5335

GPUImage 源码分析

GPUImage源码解读 介绍 GitHub - cats-oss/android-gpuimage: Android filters based on OpenGL (idea from GPUImage for iOS) 做图片或者视频滤镜渲染,离不开 OpenGL,而在移动平台上最令人熟知的就是 GitHub - BradLarson/GPUImage2: GPUImage 2 is ...

crazy_jack 2173

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

iOS GPUImage研究总结

关于GPUImage 这里直接引用官方描述:GPUImage是使用GPU处理图像的、他可以对图片、实时画面、视频进行处理。他允许你自定义滤镜、支持iOS4.0。然而,目前缺乏核心形象的一些更高级的功能,比如面部检测。

Quinn's blog ! I'm glad to be here! 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

iOS GPUImage源码解读

前言 GPUImage是iOS上一个基于OpenGL进行图像处理的开源框架,内置大量滤镜,架构灵活,可以在其基础上很轻松地实现各种图像处理功能。本文主要向大家分享一下项目的核心架构、源码解读及使用心得。 GPUImage有哪些特性 丰富的输入组件 摄像头、图片、视频、OpenGL纹理、二进制数据、UIElement(UIView, CALayer) 大量现成的内置滤镜(4大类) 1). 颜...

majiakun1的专栏 3613

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

iOS开发——GPUImage源码解析

一、基本概念 GPUImage:一个开源的、基于openGL的图片或视频的处理框架,其本身内置了多达120多种常见的滤镜效果,并且支持照相机和摄像机的实时滤镜,并且能够自定义图像滤镜。同时也很方便在原有基础上加入自己的滤镜Filter,所有滤镜是基于opengl shader(着色器)实现的,所以滤镜效果图像处理是在GPU上实现的,处理效率比较高,在iPhone6及其以上手机,可以做到实时流...

weixin_30240349的博客 378

GPUImage源码分析与使用(一)

有丰富的输入组件,可以处理图片、纹理、视频、二进制数据、UIElement(UIView、CALayer),可以使用GPUImage拍照、处理纹理图片、给视频或拍摄中的视频添加滤镜、添加水印可以使用UIElement。支持对大图进行处理,GPU的纹理限制是4096*4096,对于超出限制的图片,GPUImage会压缩处理导致损失图片质量,CoreImage会把图片拆解成小图处理。可以传入字符串类型,也可以传入文件类型,比如以.vsh/.fsh/.glsl等为后缀等命名的文件。

程序猿老樊的博客 1123

GPUImage源码解读(一)

导读: 系列文章会从结构到使用,细化到每一个变量, 使用方法全有对应 DEMO.也会有相对应的技术点扩展如(AVFoundation,OpenGL shader,CAEAGLLayer)等,目前是 Objective-C 版本的,后面会有Swift版本. GPUImage-Objective-C 官方源码 GPUImage-Swift 官方源码 GPUImage-Objective-C 添...

Philm_iOS的博客 802

c语言freeimage库文件,GPUImage源码解读之GLProgram

简述GLProgram是GPUImage中代表openGL ES 中的program,具有glprogram功能。其实是作者对OpenGL ES program的面向对象封装初始化- (id)initWithVertexShaderString:(NSString *)vShaderStringfragmentShaderString:(NSString *)fShaderString;- (id...

weixin_36176188的博客 303

GPUImage源码解读(二)

这篇文章主要是阅读GPUImage框架中的 GLProgram、GPUImageContext 两个重要类的源码。这两个类是 GPUImage 框架的基础,里面涉及的知识也有 OpenGL ES 基础 和 多线程 基础。以下是源码内容: GLProgram 一 GLProgram GLProgram专门处理OpenGL ES程序的创建等相关工作。 初始化方法,可以根据需要传入顶点着色...

Philm_iOS的博客 570

android 滤镜开源,Android_GPUImage 支持实时摄像头滤镜的GPUImage是iOS下一个开源的基于GPU的图像处理库 - 下载 - 搜珍网...

Android例子源码支持实时摄像头滤镜的GPUImage/Android例子源码支持实时摄像头滤镜的GPUImage/.gitignoreAndroid例子源码支持实时摄像头滤镜的GPUImage/library/Android例子源码支持实时摄像头滤镜的GPUImage/library/.classpathAndroid例子源码支持实时摄像头滤镜的GPUImage/library/.gitig...

weixin_36397146的博客 185

GPUImage源码解读之GLProgram

简述 GLProgram是GPUImage中代表openGL ES 中的program,具有glprogram功能。其实是作者对OpenGL ES program的面向对象封装 初始化 - (id)initWithVertexShaderString:(NSString *)vShaderString fragmentShaderString:(NSString *)fS...

weixin_30346033的博客 169

GPUImage源码解读(二十四)

GPUImageLookupFilter GPUImageLookupFilter 是GPUImage中的颜色查找滤镜,在一般的相机应用中使用得最广泛,它的作用是通过颜色变换从而产生出新风格的图片,在philm项目中也有大量使用 LUT (Lookup Tables)即查找表 。LUT是个非常简单的数值转换表,不同的色彩输入数值“映射”到一套输出数值,用来改变图像的色彩。例如:红色在LUT中可...

Philm_iOS的博客 747

GPUImage源码解读(二十五)

#GPUImageView 结构说明 . ├── GPUImage.xcodeproj │   ├── project.pbxproj │   ├── project.xcworkspace ├── GPUImageMac.xcodeproj │   ├── project.pbxproj │  

Philm_iOS的博客 458

GPUImage源码解读(二十三)

GPUImageFilter GPUImageFilter 是GPUImage中很重要、很基础的类,它可以处理帧缓存对象的输入输出,但是对纹理并不添加任何特效,也就是说只是简单的让纹理通过。它更多的是作为其它滤镜的基类,一些具体的滤镜由它的子类去完成。同时它也只能处理单个帧缓存对象的输入,处理多个帧缓存对象的输入也是由它的子类去完成 向量定义 //在 GPUImage 中主要用到了3...

Philm_iOS的博客 485
上一篇: GPUImage源码解读(七)
下一篇: GPUImage源码解读(九)
Philm_iOS
博客等级 码龄8年 74粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值