内容简介:使用GPUImage 库写过一点效果,更加好奇它的底层OpenGL ES 是怎么工作的,再加上swift已经到4.0版本,平时零零碎碎的看过一些基本东西,但是自己却一直没动手写过什么东西。临渊羡鱼,不如退而结网;笨鸟慢飞,贵在坚持。1、OpenGL ES 中世界坐标系是以屏幕中心为原点(0, 0, 0),且是始终不变的。你面对 屏幕,你的右边是x正轴,上面是y正轴,屏幕指向你的为z正轴。长度单位这样来定: 窗口范围按此单位恰好是(-1,-1)到(1,1),即屏幕左下角坐标为(-1,-1),右上角坐标为(1
导语
使用GPUImage 库写过一点效果,更加好奇它的底层OpenGL ES 是怎么工作的,再加上swift已经到4.0版本,平时零零碎碎的看过一些基本东西,但是自己却一直没动手写过什么东西。临渊羡鱼,不如退而结网;笨鸟慢飞,贵在坚持。
两个坐标系
1、OpenGL ES 中世界坐标系是以屏幕中心为原点(0, 0, 0),且是始终不变的。你面对 屏幕,你的右边是x正轴,上面是y正轴,屏幕指向你的为z正轴。长度单位这样来定: 窗口范围按此单位恰好是(-1,-1)到(1,1),即屏幕左下角坐标为(-1,-1),右上角坐标为(1,1)。
2、纹理坐标,纹理坐标是以图片的左下角为原点,向上为Y轴的正方向,区间[0,1],向右为X轴的正方向区间为[0,1]。
GLKit框架
GLKit框架是苹果为了简化基于OpenGL或者OpenGL ES的应用开发而封装的一套高级API框架
GLKit 主要的功能:
1. 纹理加载(Texture loading): GLKTextuerLoader Class.
2. 性能卓越的科学运算库, 支持矢量, 四元数,矩阵运算等。
3. 实现的常见的标准Shader特效。 GLKit允许你配置你所需要的特效,它会自动创建和加载对应的Shader。
GLKBaseEffect, GLKReflectionMapEffect, GLKSkyboxEffect Class.
4. 对应于GLKit的View和ViewController。 GLKView Class 和 GLKViewController Class.
# 流程
删除(Delete)
# 关键代码
1、配置环境
“`swift
func setupConfig(){
let glView:GLKView = self.view as! GLKView; glView.context = context; //设置渲染颜色格式 glView.drawableColorFormat = .RGBA8888; //设置渲染深度 glView.drawableDepthFormat = .format24; EAGLContext.setCurrent(context); }
“`
2、加载纹理
“`swift
func loadTexture() {
let filePath :String = Bundle.main.path(forResource: "test", ofType: "jpg")!; do { //[GLKTextureLoaderOriginBottomLeft:false] let textureInfo:GLKTextureInfo = try GLKTextureLoader.texture(withContentsOfFile: filePath, options:nil); effect.texture2d0.enabled = GLboolean(GL_TRUE); effect.texture2d0.name = textureInfo.name; } catch let error { print("error is \(error.localizedDescription)"); } }
“`
3、提交数据
“`swift
func initVertexCoordinates() {
// [-0.5 0] [0,0.5]
//前三位顶点坐标 后两位纹理坐标
let vertext:[GLfloat] = [
//左半部分
0, 1.0, 0.0, 0.5, 0.0, //右下
0, -1.0, 0.0, 0.5, 1.0, //右上
-1.0, -1.0, 0.0, 0, 1.0, //左上
0.0, 1.0, 0.0, 0.5, 0.0, //右下 -1.0, -1.0, 0.0, 0, 1.0, //左上 -1.0, 1.0, 0.0, 0.0, 0.0, //左下 //右半部分 1.0, 1.0, 0.0, 0.0, 0.0, //右下 1.0, -1.0, 0.0, 0, 1.0, //右上 0, -1.0, 0.0, 0.5, 1.0, //左上 1.0, 1.0, 0.0, 0.0, 0.0, //右下 0.0, -1.0, 0.0, 0.5, 1.0, //左上 0.0, 1.0, 0.0, 0.5, 0.0, //左下 ]; //生成新缓存对象。并返回缓存buffer id glGenBuffers(1, &buffer); //将申请的缓存对象绑定到GL_ARRAY_BUFFER中 glBindBuffer(GLenum(GL_ARRAY_BUFFER), buffer); //将顶点数据拷贝到缓存对象中 glBufferData(GLenum(GL_ARRAY_BUFFER), GLsizeiptr(MemoryLayout<GLfloat>.size * vertext.count) , vertext, GLenum(GL_STATIC_DRAW)); //启用顶点 glEnableVertexAttribArray(GLuint(GLKVertexAttrib.position.rawValue)); glVertexAttribPointer(GLuint(GLKVertexAttrib.position.rawValue), 3, GLenum(GL_FLOAT), GLboolean(GL_FALSE), GLsizei(MemoryLayout<GLfloat>.size * 5), nil); //启用纹理 let offset :GLsizeiptr = MemoryLayout<GLfloat>.size * 3; glEnableVertexAttribArray(GLuint(GLKVertexAttrib.texCoord0.rawValue)); glVertexAttribPointer(GLuint(GLKVertexAttrib.texCoord0.rawValue), 2, GLenum(GL_FLOAT), GLboolean(GL_FALSE), GLsizei(MemoryLayout<GLfloat>.size * 5), UnsafeRawPointer.init(bitPattern: offset)); }
4、渲染
swift
func glkView(_ view: GLKView, drawIn rect: CGRect) {
glClearColor(0.1, 0.5, 0.0, 1);
glClear(GLbitfield(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT));
effect.prepareToDraw();
glDrawArrays(GLenum(GL_TRIANGLES), 0, 12);
}
“`
# 写在最后
* 花的时间较多地方还是在 swift这块。语法的不适应和swift指针的类型的转换花掉了不少时间,基本是边百度边写的状态完成的。
* 镜像效果不难,了解OpenGL 或者用GPUImage 写过效果的都会很自然的想到使用 纹理裁剪
相关
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 生成DOCKER图片镜像
- KVM镜像制作及挂载镜像文件
- 查看Docker镜像仓库中镜像的所有标签
- Vagrant 使用国内镜像安装插件和 box 镜像
- 不要轻易使用 Alpine 镜像来构建 Docker 镜像,有坑!
- Harbor 1.7 发布,在线 GC、镜像历史、镜像复制
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
C++ Primer 中文版(第 4 版)
Stanley B.Lippman、Josée LaJoie、Barbara E.Moo / 李师贤、蒋爱军、梅晓勇、林瑛 / 人民邮电出版社 / 2006 / 99.00元
本书是久负盛名的C++经典教程,其内容是C++大师Stanley B. Lippman丰富的实践经验和C++标准委员会原负责人Josée Lajoie对C++标准深入理解的完美结合,已经帮助全球无数程序员学会了C++。本版对前一版进行了彻底的修订,内容经过了重新组织,更加入了C++ 先驱Barbara E. Moo在C++教学方面的真知灼见。既显著改善了可读性,又充分体现了C++语言的最新进展和当......一起来看看 《C++ Primer 中文版(第 4 版)》 这本书的介绍吧!