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方向偏移量,乘以系数,系数因子为屏幕宽/屏幕高

这样无论在何种机器上,都可以吻合,不会出现因为屏幕宽高不同而导致的错位问题

发表评论

电子邮件地址不会被公开。 必填项已用*标注