zzy*_*yzy 5 scenekit sprite-kit skscene metal
在观看了WWDC2017的会话609视频后,我开始大肆宣传从SpriteKit中取出屏幕外的金属纹理.
这是一年多前了!
然而,绝对没有概述文档SKRenderer,也没有示例代码.
https://developer.apple.com/documentation/spritekit/skrenderer
我发现这确实很奇怪. 这里有没有人对这个类,它的文档或示例代码有任何见解?
顺便说一句,同样的道理SKTransformNode.
war*_*enm 12
基本用法SKRenderer非常简单,但有一些奇怪之处使它在实践中有点古怪.
首先是基本面.要实例化渲染器,请使用该rendererWithDevice:方法.此方法采用a id<MTLDevice>,例如系统默认设备.原谅Objective-C; 这将很容易转换为Swift:
SKRenderer *renderer = [SKRenderer rendererWithDevice:mtlDevice];
Run Code Online (Sandbox Code Playgroud)
要告诉渲染器要绘制什么,我们将它与先前创建的场景相关联:
renderer.scene = (SKScene *)scene;
Run Code Online (Sandbox Code Playgroud)
如果要运行操作,则需要手动取消暂停场景,这通常是SKView在呈现场景时完成的:
scene.paused = NO;
Run Code Online (Sandbox Code Playgroud)
要实际绘制场景,我们需要提供命令缓冲区和渲染传递描述符.假设您正在使用a MTKView来处理运行显示链接计时器并管理a CAMetalLayer,您可以编写这样的委托方法,它通过渲染器更新场景的时间(和动作),然后绘制到MTKView可绘制的:
- (void)drawInMTKView:(nonnull MTKView *)view {
MTLRenderPassDescriptor *renderPassDescriptor = view.currentRenderPassDescriptor;
if (renderPassDescriptor == nil) {
return;
}
[self.renderer updateAtTime:CACurrentMediaTime()];
id<MTLCommandBuffer> commandBuffer = [self.commandQueue commandBuffer];
CGRect viewport = CGRectMake(0, 0, view.drawableSize.width, view.drawableSize.height);
[self.renderer renderWithViewport:viewport
commandBuffer:commandBuffer
renderPassDescriptor:renderPassDescriptor];
// TODO: Add any additional Metal rendering here
[commandBuffer presentDrawable:view.currentDrawable];
[commandBuffer commit];
}
Run Code Online (Sandbox Code Playgroud)
请记住,在设置MTKView的framebufferOnly属性NO,如果你使用这种技术.
如果要将屏幕外渲染为您创建的纹理,则需要进行更多手动工作,但所涉及的概念是相同的.您可以通过创建其他渲染传递描述符/编码器来编码渲染到相同纹理的单独传递; 只需记住设置loadAction主要颜色附件,MTLLoadActionLoad以保持跨越过程的纹理内容.
您还可以使用renderWithViewport:renderCommandEncoder:renderPassDescriptor:commandQueue:它将所有绘图合并为一个通道.
一些警告:
viewport参数被忽略.SKScene接收NSResponder操作,则需要手动转发它们或将场景插入响应器链.这尤其适用于关键事件,其中场景(或负责转发给它的对象)需要是第一响应者.SKView; 你需要做一些手动翻译.| 归档时间: |
|
| 查看次数: |
453 次 |
| 最近记录: |