问题标签 [nsopenglview]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
228 浏览

macos - OpenGL:可以看穿一堵墙,但看不到另一堵墙

我不知道这是深度缓冲区问题还是其他问题。我可以看穿一堵墙,但看不到另一堵墙:

墙可见

现在,当我旋转时,第二面墙变得更加突出:

在此处输入图像描述

在此处输入图像描述

我在 Interface Builder 中启用了深度缓冲区。我的 OGL 启用如下所示:

有什么建议么。我注释掉了其他启用,因为它们似乎没有帮助。

根据要求,这是投影和模型视图设置:

0 投票
1 回答
887 浏览

osx-mountain-lion - 在 NSDocument (OS X) 中创建 NSOpenGLView

我正在创建一个音乐教育应用程序,它可以读取乐谱 - 而不是音频文件 - 并且需要呈现一个动画图形屏幕。我创建了一个基于文档的应用程序来轻松访问文件,现在我让它读取和解析文件,并且我将所有歌曲数据存储在我的 Obj-C 类中。我的 xib 中还有一个 textview,我可以在其中写入歌曲属性和其他文本花絮。现在我想要第二个视图,它需要图形化和动画化,用于音乐。我是 Xcode 新手,但有一些 openGL 经验。我的设置是最新的操作系统和 Xcode 版本。

当我尝试将 OpenGL 视图拖到 IB 中的窗口中时,我收到一个奇怪的错误/警告,上面写着“不支持的配置 - 启用 One Shot 内存的窗口中的 NSOpenGLView”(这很奇怪),并且当我运行应用程序。

我在此站点或其他任何地方的 NSdocuments 中找不到太多对 OpenGL 视图的引用,这让我觉得我可能正在尝试做一些不应该做的事情。有人对我有什么建议吗?我不应该使用基于文档的应用程序吗?我应该使用openGL以外的东西吗?或者,在这种情况下,也许我需要 100% 以编程方式构建 openGL 视图和视图控制器?对一些适用的示例/教程的任何建议或指示都会有很大的帮助。

0 投票
0 回答
527 浏览

objective-c - 如何在 NSOpenGLView 上绘制 RGB 图像缓冲区或 CVPixelBufferRef?

我有NSOpenGLView来自AVFoundation. 我想使用Viewframes在我的表单上显示视频。OpenGL

0 投票
1 回答
802 浏览

objective-c - 带有 Cocoa 的 OpenGL:尝试调用 CGLLockContext([[self openGLContext] CGLContextObj]) 时没有匹配的函数调用;

我正在学习 OpenGL。为了获得 OpenGL 上下文设置,我遵循 Apple 的GlEssentials示例。GlContext 被锁定在 draw 方法中,如下所示:

当我尝试CGLLockContext在视图类中使用与上面完全相同的参数调用时,出现以下错误:

快速插入类型转换解决了这个问题:

问题是为什么?在 Apples 示例中,没有这种类型转换它可以正常工作。

0 投票
1 回答
154 浏览

macos - NSOpenGLContext 破坏另一个上下文的纹理

我正在使用 NSOpenGLContext 来优化绘图 AU 插件。有多个插件,每个插件都可以有多个实例。所以每个插件都会创建一个全局 NSOpenGLContext 并将特定的 NSView 上下文附加到它,这样就不需要复制纹理。

问题:当我打开一个插件时,没问题。我打开一个不同的,没关系。现在我释放第一个,它破坏了所有资源 => 第二个失去了它的纹理!

我检查了两个上下文不同,共享不同,它们都在 lockFocus 和 drawRect 中使用 makeCurrentContext。任何想法这里有什么问题?

顺便说一句。我在使用 AGL 和 WGL(在 Windows 上)时得到了同样的东西,两者都没有问题,所以它就像往常一样只是 Cocoa。

0 投票
0 回答
456 浏览

objective-c - 调整窗口大小后未调用 NSOpenGLView drawRect

我在浮动 NSPanel 中有一个 NSOpenGLView 对象,我使用 glDrawPixels 渲染图像。在调整窗口大小之前,一切正常。当调用 NSPanel 对象的调整大小函数时,我通过返回固定大小来阻止调整大小,但是当光标单击在窗口边缘并尝试调整窗口大小时,窗口不会调整大小,但在按住几秒钟后,OpenGL 视图的自动更新停止被调用。

以下是简化的步骤列表:

  1. 自动调用drawRect
  2. 用户尝试调整窗口大小(单击并拖动几秒钟)
  3. drawRect 停止自动调用。(reshape 函数中的 setNeedsDisplay 或 [openglcontext update] 无济于事)

我的 OpenGLContext 设置为以下格式:

在drawRect中:

有谁知道让drawRect自动更新重新启动的解决方案?我知道,或者我可以完全摆脱自动更新并使用 NSNotificationCenter 或使用 NSTimer 自己调用它,但如果我可以使用默认的 OpenGL 上下文和默认更新方法,我更愿意。提前感谢您的帮助!

- - - - - 编辑 - - - - - -

我找到了上述问题的可能解决方案,但我意识到还有另一个问题,即更新会突然停止。上述解决方案的问题不是一个优雅的问题,但它确实有效。我基本上禁用了启用调整大小蒙版的窗口样式蒙版。任何人都知道为什么 drawRect 会随机停止?有时它会完全渲染,但有时它会冻结并且永远不会继续。

0 投票
1 回答
1455 浏览

objective-c - 删除子视图后,包含 NSOpenGLView 的 NSView 不会重绘

我有一个 Mac OS X (10.9) 应用程序,它为我的主 NSWindow 的contentView属性提供了一个自定义 NSView。自定义视图唯一要做的就是覆盖drawRect:,使其透明。透明度是必需的,以便我的 NSOpenGLView 可见(见下文):

contentView一个 NSOpenGLView 作为子视图,其表面顺序设置为 -1(它在主 NSWindow 的“下方”,它也是透明的):

然后我实例化一个 WebView 并将其放置为这个自定义视图的子视图:

WebView 是窗口中的一个小框(在 NSOpenGLView 的顶部),用于登录服务。一旦登录发生,它应该会消失,只显示 NSOpenGLView。

这就是问题所在:当我调用时[_webview removeFromSuperview];不会contentView重绘;因此,WebView 仍然在屏幕上绘制(尽管不响应鼠标或键盘)。如果我使用鼠标调整所有内容所在的窗口大小,则contentView重绘(我在日志中看到消息)并且 WebView 的内容消失。此外,如果我不将 NSOpenGLView 添加为子视图,则 WebView 会按原样消失。

删除子视图后不应该contentView着火吗?drawRect即使我使用setNeedsDisplay:setNeedsLayout:删除 WebView 后contentView仍然没有重绘。

0 投票
0 回答
766 浏览

macos - 同步两个 NSOpenGLView 的 flushBuffer

我正在开发一个由两个NSOpengGLViews (leftGLViewrightGLView) 并排放置在 NSWindow contentView 内的 OSX 应用程序。这两个视图不共享NSOpenGLContext但都是双缓冲的,并将缓冲区交换与监视器回溯同步。

ACVDisplayLink已设置并链接到第一个的NSOpenGLContextand (比如左侧)。NSOpenGLPixelFormatNSOpenGLView

在 CVDisplayLink 回调中,我使用以下代码绘制到两个视图:

这种方法的问题是两者flushBuffer并不总是同步的。右侧 NSOpenGLView 有时会比左侧更新晚(可能在下一次显示器刷新期间)。这并不完全出乎意料,因为苹果文档中关于-flushBuffer状态:

根据交换间隔上下文属性(参见 NSOpenGLCPSwapInterval),复制可能发生在监视器的垂直回溯期间,而不是在调用 flushBuffer 之后立即发生。一个隐式的 glFlush 在它返回之前由 flushBuffer 完成。为了获得最佳性能,应用程序不应在调用 flushBuffer 之前立即调用 glFlush。后续的 OpenGL 命令可以在调用 flushBuffer 后立即发出,但直到缓冲区复制完成后才会执行。

但是,在这种情况下,我有两个不同的NSOpenGLContext缓冲区,因此应该可以将两个缓冲区一起刷新。

为了进一步研究这一点,我假设-flushBuffer仅在交换(或复制)缓冲区后才返回,并且由于这仅与监视器回溯同步发生,因此对 flushBuffer 的第二次调用在该回溯上发生为时已晚。这可以解释我观察到的行为。因此,我尝试分离一个辅助线程来执行 flushBuffer 调用,但没有任何区别。

我终于尝试使用两种不同CVDisplayLink的 s,一种用于左侧 GLView,另一种用于右侧。然而,这种技术似乎也没有解决问题,并且增加了保持两个 CVDisplayLink 线程同步的额外复杂性。

有没有办法让这两个flushBuffer在两个 NSOpenGLViews 之间同步发生?

0 投票
1 回答
176 浏览

macos - 缩小窗口后 NSOpenglView 出现在 NSView 前面

我在 NSOpenGLView 上显示了一个 NSView。我正在使用“setWantsLayer:YES”来强制 NSView 出现在 opengl 上下文中。但是当我最小化窗口并再次将其最小化时,NSView 不再超过 NSOpenGLView。

有没有办法防止这种行为?

0 投票
1 回答
636 浏览

image - nsopenglview 图像缩放,缩放以适合视图中的图像

对openGL来说是全新的。我有这段代码,它使用 OpenGL 显示我的图像。

我面临的问题是我的图像尺寸是 5184x3456px,但我的视图尺寸是 800x600。我如何将我的图像放在我的视图中。一直试图理解代码,但无处可去。

尝试使用 glScalef(0.8, 0.8, 0.8); 但它做了什么,它缩放了它所显示的屏幕部分。