gpt4 book ai didi

objective-c - 在不同的NSWindow中的NSOpenGLView上绘制不同的形状

转载 作者:行者123 更新时间:2023-12-02 22:25:30 26 4
gpt4 key购买 nike

我在Mac OS的 objective-c 中使用AudioVisualizer进行工作。
我有2个NSWindows,其中有NSOpenGLView。

enter image description here

如果仅使用NSOpenGLView打开1个NSWindow,它将显示形状而没有任何问题。

但是,如果打开2个带有NSOpenGLView的NSWindows,则只有一个GLView会绘制形状,但是在其他NSWindow中播放其他音频时,该形状与其音频不匹配。

在NSOpenGLViews中,只要需要显示CADisplayLink,它就会精确地调用redraw方法。

这是与OpenGLContext相关的部分。

self.openGLContext = [[NSOpenGLContext alloc] initWithFormat:self.pixelFormat
shareContext:nil];

这是 redraw方法
[self.openGLContext makeCurrentContext];
[self.openGLContext lock];

[self redrawWithPoints:self.info->points
pointCount:self.info->pointCount
baseEffect:self.baseEffect
vertexBufferObject:self.info->vbo
vertexArrayBuffer:self.info->vab
interpolated:self.info->interpolated
mirrored:self.shouldMirror
gain:self.gain];

[self.openGLContext flushBuffer];
[self.openGLContext unlock];
[NSOpenGLContext clearCurrentContext];

这是redrawWithPoints方法
glClear(GL_COLOR_BUFFER_BIT);
GLenum mode = interpolated ? GL_TRIANGLE_STRIP : GL_LINE_STRIP;
float interpolatedFactor = interpolated ? 2.0f : 1.0f;
float xscale = 2.0f / ((float)pointCount / interpolatedFactor);
float yscale = 1.0f * gain;
GLKMatrix4 transform = GLKMatrix4MakeTranslation(-1.0f, 0.0f, 0.0f);
transform = GLKMatrix4Scale(transform, xscale, yscale, 1.0f);
baseEffect.transform.modelviewMatrix = transform;
glBindBuffer(GL_ARRAY_BUFFER, vbo);
[baseEffect prepareToDraw];
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition,
2,
GL_FLOAT,
GL_FALSE,
sizeof(GOAudioPlotGLPoint),
NULL);
glDrawArrays(mode, 0, pointCount);
if (mirrored)
{
baseEffect.transform.modelviewMatrix = GLKMatrix4Rotate(transform, M_PI, 1.0f, 0.0f, 0.0f);
[baseEffect prepareToDraw];
glDrawArrays(mode, 0, pointCount);
}


glFlush();

我想同时在不同的NSOpenGLViews中显示不同的Audio Visualizer。

是否可以使用OpenGL?

最佳答案

您正在使用顶点缓冲区对象和顶点数组缓冲区进行绘制,但似乎没有在两个上下文之间共享。这意味着当您在第二个上下文中使用顶点缓冲对象时,该ID在该上下文中不存在。但是,如果您将第一个上下文用作第二个 View 创建shareContext:NSOpenGLContext参数,则可以在上下文之间共享对象。

它有助于在代码中定期添加对glGetError()的调用,以提醒您此类问题。

关于objective-c - 在不同的NSWindow中的NSOpenGLView上绘制不同的形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49986990/

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