在 NSView 子类中呈现 OpenGL 不会呈现 [关闭]

Rendering OpenGL within an NSView subclass does not render [closed]

提问人:Tim Kane 提问时间:7/21/2023 更新时间:7/23/2023 访问量:57

问:


编辑问题以包括所需的行为、特定问题或错误以及重现问题所需的最短代码。这将帮助其他人回答这个问题。

4个月前关闭。

我有使用 NSOpenGLView 的现有代码。 我想改用一个子类的 NSView 控制器,而且我遇到了一些障碍(尤其是因为 OpenGL 在 Mac 上早已被弃用。我仍然坚持)。

我想探索一下 Apple 的这个示例代码,它似乎可以很好地满足我的需求作为参考。左侧窗口显示 NSOpenGLView,而右侧窗口显示 NSView 方法。更好的是,此示例代码仍然可以编译和运行!

遗憾的是,此示例也无法呈现子类化的 NSView,而 NSOpenGLView 继续呈现良好。

以下是它在 M2 Mac 上的渲染方式。enter image description here

虽然我很欣赏 Apple 很久以前在 Mac 上弃用了 OpenGL,但我希望能够遵循此示例作为 NSView 方面的参考。

我可以看到在“MyOpenGLView”中命中的唯一代码是方法。该类似乎根本没有收到任何后续消息。initWithFrame

这很可能是此示例的简单修复,它可能有助于我确定我在自己的代码中做错了什么。

非常感谢任何使此示例正确运行的指示(甚至只是获得右侧渲染而不是左侧渲染)。

macOS 可可 OpenGL NSView NSpenGLview

评论

0赞 Willeke 7/22/2023
示例代码已经过时了。 已弃用,显然不再调用。lockFocus

答:

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];

输出: enter image description here

评论

0赞 Tim Kane 7/23/2023
出色的工作,谢谢@apodidae
0赞 Tim Kane 7/23/2023
你确定的最初变化确实解锁了东西。我还发现,将视口设置为两倍的尺寸(并保持正交不变),图像现在会填充视口。我曾经满足过这种计算,尽管它确实警告在主线程之外使用它。FWIW,我已经设法让我自己的 NSView 也表现得体,这是非常相同的问题,未能做到[self convertRectToBacking:self.layer.bounds][[self openGLContext] setView:self];