作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最初使用 GLKit 创建 opengl 上下文,但我需要放弃它以便在单独的线程上创建 opengl 上下文。我让它在一个单独的线程中运行,但是图片失真了,看起来像戴错了处方眼镜一样模糊。我遵循了这个设置教程,但是是在 Swift 中完成的。 http://www.raywenderlich.com/3664/opengl-tutorial-for-ios-opengl-es-2-0 .默认情况下,我的应用程序处于横向状态。一切都在画,只是完全没有焦点。当我通过 GLKViewController 创建 opengl 并使用 GLKView 时,它非常清晰和完美,但我不能使用它们。任何想法将不胜感激。
import Foundation
import UIKit
import QuartzCore
import OpenGLES
@objc class OpenGlView : UIView{
var eaglLayer:CAEAGLLayer!;
var context:EAGLContext!;
var colorRenderBuffer:GLuint = 0;
var depthBuffer:GLuint = 0;
var glThread:NSThread!;
var engine:Engine!;
override init (frame : CGRect) {
super.init(frame : frame)
setupLayer();
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder);
setupLayer();
}
func setEngine(engine:Engine){
self.engine = engine;
}
func setupGL(){
glThread = NSThread(target: self, selector: "glRun", object: nil);
glThread.start();
}
func glRun(){
//Start and run Opengl on a separate Thread
setupContext();
setupRenderBuffer();
setupFrameBuffer();
engine.setupEngine();
setupDisplayLink();
print("THREAD STARTED!");
}
private func setupLayer(){
eaglLayer = self.layer as! CAEAGLLayer;
eaglLayer.opaque = true;
}
private func setupContext(){
let api:EAGLRenderingAPI = EAGLRenderingAPI.OpenGLES2;
context = EAGLContext(API: api);
if ((context == nil)) {
print("Failed to initialize OpenGLES 2.0 context");
exit(1);
}
if (!EAGLContext.setCurrentContext(context)) {
print("Failed to set current OpenGL context");
exit(1);
}
}
private func setupRenderBuffer(){
glGenRenderbuffers(1, &colorRenderBuffer);
glBindRenderbuffer(GLenum(GL_RENDERBUFFER), colorRenderBuffer);
context.renderbufferStorage(Int(GL_RENDERBUFFER), fromDrawable: eaglLayer);
}
private func setupFrameBuffer(){
var framebuffer:GLuint = 0;
glGenFramebuffers(1, &framebuffer);
glBindFramebuffer(GLenum(GL_FRAMEBUFFER), framebuffer);
glFramebufferRenderbuffer(GLenum(GL_FRAMEBUFFER), GLenum(GL_COLOR_ATTACHMENT0), GLenum(GL_RENDERBUFFER),colorRenderBuffer);
}
private func setupDisplayLink(){
let displayLink = CADisplayLink(target: self, selector: "render");
displayLink.frameInterval = 1;
displayLink.addToRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode);
NSRunLoop.currentRunLoop().run();
}
func render(){
engine.update();
engine.draw();
context.presentRenderbuffer(Int(GL_RENDERBUFFER));
}
override static func layerClass() -> AnyClass{
return CAEAGLLayer.self;
}
最佳答案
所以我发现问题出在视网膜屏幕上。 GLKView 自动处理这个,但是如果你在你自己的 View 中设置 opengl,你需要用这个来处理它,
self.contentScaleFactor = UIScreen.mainScreen().scale;
您还需要将 glViewport() 缩放到缩放后的值。
编辑:
使用 UIScreen.mainScreen().nativeScale,见下方评论。
关于ios - 手动设置后 iOS 上的 Opengl 渲染失焦,而不是使用 GLKit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33427042/
pyqt5 失焦 无操作监听 以下内容转自: 如何捕获PyQt5 QMainWindow失去焦点-python黑洞网 timer可以更新ui。 class MainUi(QtWidgets.QMa
我是一名优秀的程序员,十分优秀!