我一直堅持了幾個小時,試圖使用CARenderer將Core Animation圖層樹渲染到OpenGL上下文中。 OpenGL上下文當前由Interface Builder中設置的NSOpenGLView子類提供,並且具有默認設置。CARenderer從不產生輸出
以下是我在我的例子建立CALayers:
l1 = [[CALayer layer] retain]; // l1 is an instance variable
l1.bounds = CGRectMake(0, 0, 100, 100);
l1.backgroundColor = CGColorCreateGenericRGB(1, 1, 0, 1);
CALayer* l2 = [CALayer layer];
l2.bounds = CGRectMake(0, 0, 20, 20);
l2.backgroundColor = CGColorCreateGenericRGB(1, 0, 0, 1);
l2.position = CGPointMake(50, 50);
[l1 addSublayer:l2];
如果我添加這些有規律的NSView,他們出現就好了。
下面是從我NSOpenGLView子類中的繪圖代碼:
- (void) drawRect:(NSRect)dirtyRect
{
NSRect frame = [self frame];
// set up context according to CARenderer.h instructions
glViewport(0, 0, frame.size.width, frame.size.height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, frame.size.width, 0, frame.size.height, -1, 1);
glClearColor(0, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT);
if (l1)
{
CARenderer* renderer = [CARenderer rendererWithCGLContext:[[self openGLContext] CGLContextObj] options:nil];
renderer.layer = l1;
renderer.bounds = NSRectToCGRect(frame);
[renderer beginFrameAtTime:0.0 timeStamp:NULL];
[renderer addUpdateRect:renderer.bounds];
[renderer render];
[renderer endFrame];
}
glFlush();
}
我驗證了層已被創建之後的觀點是重新繪製,視圖本身似乎好工作 - OpenGL命令我正確發行放映。 CARenderer確實存在(事實上,如果在代碼運行時l1已經連接到另一個上下文,它將會盡職盡責)。沒有可見的輸出。
我試過的其他東西:在CATransaction中包裝CARenderer代碼,擺弄界面生成器中的NSOpenGLView設置選項,將整個事件渲染爲手動創建的OpenGL上下文,並將其保存到圖像文件中...所有相同的效果:原生OpenGL命令顯示正常,CARenderer不顯示任何內容。
我懷疑我的OpenGL上下文設置的方式有問題,或者我甚至可能以某種方式在我的視口之外渲染......可能是一些非常愚蠢的小細節。不幸的是,Web上CARenderer的文檔和示例代碼都有些稀疏,雖然我對Core Animation有相當的經驗,但我的OpenGL知識卻是有限的。
所以現在,我很難過,完全沒有想法,所以任何指針都非常感謝!
乾杯
感謝您發佈此信息。在prepareOpenGL方法之後,似乎有助於讓CALayer擁有一個非零表示層,而不會實際顯示(我試圖使用CAKeyFrameanimation來冒險計算沿着CGPath的點) – 2015-08-05 04:26:09