gpt4 book ai didi

ios - 手动设置后 iOS 上的 Opengl 渲染失焦,而不是使用 GLKit

转载 作者:行者123 更新时间:2023-11-28 06:56:44 25 4
gpt4 key购买 nike

我最初使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com