提问人:Tim Kane 提问时间:7/21/2023 更新时间:7/23/2023 访问量:57
在 NSView 子类中呈现 OpenGL 不会呈现 [关闭]
Rendering OpenGL within an NSView subclass does not render [closed]
问:
我有使用 NSOpenGLView 的现有代码。 我想改用一个子类的 NSView 控制器,而且我遇到了一些障碍(尤其是因为 OpenGL 在 Mac 上早已被弃用。我仍然坚持)。
我想探索一下 Apple 的这个示例代码,它似乎可以很好地满足我的需求作为参考。左侧窗口显示 NSOpenGLView,而右侧窗口显示 NSView 方法。更好的是,此示例代码仍然可以编译和运行!
遗憾的是,此示例也无法呈现子类化的 NSView,而 NSOpenGLView 继续呈现良好。
虽然我很欣赏 Apple 很久以前在 Mac 上弃用了 OpenGL,但我希望能够遵循此示例作为 NSView 方面的参考。
我可以看到在“MyOpenGLView”中命中的唯一代码是方法。该类似乎根本没有收到任何后续消息。initWithFrame
这很可能是此示例的简单修复,它可能有助于我确定我在自己的代码中做错了什么。
非常感谢任何使此示例正确运行的指示(甚至只是获得右侧渲染而不是左侧渲染)。
答:
0赞
apodidae
7/23/2023
#1
该演示可以正常工作,但需要更改 MyOpenGLView.m 中的几行代码。我不确定我是否能回忆起所做的每一个改变;基本上纠正每条错误消息并REM删除不必要的内容,例如填写文本字段。方法 -lockFocus 从未被调用过,所以我将以下两行代码复制/粘贴到被调用的 -initWithFrame() 的底部:
[self prepareOpenGL];
[[self openGLContext] setView:self];
此外,当它在方法 -drawView 中使用 [self bounds].width 和 .height 时,请替换实际值,如下所示:
glViewport(0,0,640,400);
[renderer makeOrthographicForWidth:640 height:400];
评论
0赞
Tim Kane
7/23/2023
出色的工作,谢谢@apodidae
0赞
Tim Kane
7/23/2023
你确定的最初变化确实解锁了东西。我还发现,将视口设置为两倍的尺寸(并保持正交不变),图像现在会填充视口。我曾经满足过这种计算,尽管它确实警告在主线程之外使用它。FWIW,我已经设法让我自己的 NSView 也表现得体,这是非常相同的问题,未能做到[self convertRectToBacking:self.layer.bounds]
[[self openGLContext] setView:self];
评论
lockFocus