Updated on 四月 27, 2019
Swift OpenGL ES踩坑
最近在把一份iOS obj-c代码移植到swift,其中有OpenGL ES,swift的OpenGL资料是在太少,一步一个坑。记录一下
func glkView(_ view: GLKView, drawIn rect: CGRect)只调用一次问题
费尽心机移植完后,发现func glkView(_ view: GLKView, drawIn rect: CGRect)只在界面初始化的时候调用,而不是每帧都调用。最终在网络的小角落里找到了解决方法。在GLKViewController设置self.isPaused = false
绘制的图像存在拉抻问题,Y方向要长于X方向
这个问题其实在obj-c的代码里就存在了,当时只是根据屏幕大小来设置一下y方向大致的scale,但是没明白所以然,scale也是试出来的不是由算式算出来的。
经过在网上搜索,有幸看到了解决方法。设置projectionMatrix的aspect,aspect为OpenGL绘制区域的width/height。
VolumeModel.effect.transform.projectionMatrix = GLKMatrix4MakePerspective(Float(0.25*Double.pi), 2.0/3.0, 2, -1)
参考
https://www.jianshu.com/p/ed7fb9555839
swift OpenGL ES参考
https://www.jianshu.com/p/e0a7fe158d9c
系列文章
以及
https://github.com/skyfe79/LearningOpenGLES2
OpenGL绘制图像大小校准
由于程序中有用Quartz2D绘图,相当于在两个坐标系。而且OpenGL的摄像机的z轴高度是影响绘制的2D图像大小的因素。怎么把OpenGL绘制的图像与Quartz2D绘制的图像校准则是个问题。
前提条件:
1、OpenGL是以屏幕中心为(0,0),向上为y正向,向右为x正向。
2、OpenGL的画布大小由屏幕的Y方向大小决定
3、Quartz2D在add view时,以屏幕中心为y方向中点。画布高度由宽度决定。(高度是宽度的x倍)
4、Quartz2D绘制的图像大小是由屏幕宽度为决定因素
方法:
1、OpenGL Y方向scale校准,在上一段落已经说明了。
2、在某一型号手机上依然通过试验的方法,确定一个OpenGL的scale,还有OpenGL的Y方向偏移量,使得OpenGL的图像与Quartz2D图像吻合。
3、对这个scale、y方向偏移量,乘以系数,系数因子为屏幕宽/屏幕高
这样无论在何种机器上,都可以吻合,不会出现因为屏幕宽高不同而导致的错位问题