- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在努力更好地理解使用 Metal Performance Shaders
时的同步要求和一个 MTLBlitCommandEncoder
.
我有一个 MTLCommandBuffer
设置如下:
使用 MTLBlitCommandEncoder
将纹理 A 的区域复制到纹理 B。纹理 A 比纹理 B 大。我正在从纹理 A 中提取“图 block ”并将其复制到纹理 B。
使用MPSImageBilinearScale
Metal 性能着色器,纹理 B 作为源纹理,第三个纹理纹理 C 作为目标。此 Metal 性能着色器将缩放并可能将纹理 B 的内容转换为纹理 C。
在 Metal 性能着色器开始尝试缩放纹理 B 之前,如何确保 blit 编码器完全完成将数据从纹理 A 复制到纹理 B?我是否还需要为此担心,或者命令缓冲区的串行特性是否已经为我解决了这个问题?
Metal 有栅栏的概念使用 MTLFence
用于同步对资源的访问,但无论如何我都看不到 Metal 性能着色器在栅栏上等待。 (而 waitForFence:
出现在编码器上。)
如果我不能使用 fences 而我确实需要同步,推荐的做法是将 blit 编码器加入队列,然后调用 waitUntilCompleted
在将着色器加入队列并调用之前在命令缓冲区上 waitUntilCompleted
第二次?例如:
id<MTLCommandBuffer> commandBuffer;
// Enqueue blit encoder to copy Texture A -> Texture B
id<MTLBlitCommandEncoder> blitEncoder = [commandBuffer blitCommandEncoder];
[blitEncoder copyFromTexture:...];
[blitEncoder endEncoding];
// Wait for blit encoder to complete.
[commandBuffer commit];
[commandBuffer waitUntilCompleted];
// Scale Texture B -> Texture C
MPSImageBilinearScale *imageScaleShader = [[MPSImageBilinearScale alloc] initWithDevice:...];
[imageScaleShader encodeToCommandBuffer:commandBuffer...];
// Wait for scaling shader to complete.
[commandBuffer commit];
[commandBuffer waitUntilCompleted];
我认为我需要将中间副本复制到纹理 B 的原因是因为 忽略这个脚注,因为我忘记了一些基本的数学原理,并且从那以后想出了如何使缩放变换的平移属性与 clipRect 一起工作。MPSImageBilinearScale
似乎缩放其整个源纹理。 clipOffset
对输出很有用,但不适用于实际的缩放或变换。因此,需要将图 block 从纹理 A 提取到与图 block 本身大小相同的纹理 B 中。然后缩放和变换将“有意义”。
最佳答案
Metal 会为您处理这件事。驱动程序和 GPU 以串行方式在命令缓冲区中执行命令。 (“好像”允许并行运行或乱序运行以提高效率,但前提是结果与串行运行时相同。)
当 CPU 和 GPU 处理相同的对象时,就会出现同步问题。还可以在屏幕上呈现纹理。 (您不应该渲染到屏幕上显示的纹理。)
有一个 section of the Metal Programming Guide它处理着色器对资源的读写访问,这并不完全相同,但应该让你放心:
Memory Barriers
Between Command Encoders
All resource writes performed in a given command encoder are visible in the next command encoder. This is true for both render and compute command encoders.
Within a Render Command Encoder
For buffers, atomic writes are visible to subsequent atomic reads across multiple threads.
For textures, the
textureBarrier
method ensures that writes performed in a given draw call are visible to subsequent reads in the next draw call.Within a Compute Command Encoder
All resource writes performed in a given kernel function are visible in the next kernel function.
关于objective-c - 如何将 Metal Performance Shader 与 MTLBlitCommandEncoder 同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52007588/
我正在编写一个着色器,对场景渲染的纹理产生模糊效果。 我需要在 2 遍中做到这一点,所以通过 P0 进行水平模糊,并在 P1 中进行垂直模糊。 问题是: 我如何在 P0 channel 上获取 PS
我正在尝试从源代码运行 python 应用程序,它具有: from shader import ShaderProgram,ShaderCode 我不知道要下载+安装什么才能获得“着色器”。它非常不具
着色器编译成功,但程序在渲染开始后立即崩溃...这是我得到的错误:“着色器中没有名称为‘u_texture’的制服”。这是我的着色器的样子: #ifdef GL_ES precision medium
当我使用 xcode 8 在 ios 10 中运行我的应用程序时,我在调试控制台中收到以下消息,并且通过 UI 卡住,任何人都可以知道为什么会发生这种情况 ERROR /BuildRoot/Lib
我第一次实现延迟渲染/着色时遇到了一些我自己无法解决的问题:/。 同时渲染几何 channel 和延迟 channel 时,我得到了这个看起来很奇怪的输出 在设置拓扑、输入布局等之前,我在延迟传递的开
我正在为教程开发法线贴图实现,出于教学目的,我想将 TBN 矩阵传递给片段着色器(从顶点着色器),这样我就可以将切线空间中的法线 vector 转换为世界 -照明计算的空间。法线贴图应用于二维平面,其
我第一次尝试将 bool 值传递到我的顶点着色器中;到目前为止我只使用过 float 。 所讨论的 bool 值是特定于原语的,因此不能作为统一传递。然而,对于任何给定图元的所有顶点,它具有相同的值。
这两个是我的 VertexShader 和 Fragment Shader 文件: 顶点着色器文件: attribute vec4 position; attribute vec4 input
我正在尝试在 Unity 中创建线框顶点/片段着色器。根据 this paper 似乎可能.一般的想法似乎是将顶点着色器中计算的距离向量传递给片段着色器中的每个片段,它可以使用它来确定根据线框线在多边
当前正在制作游戏,并试图在单击“菜单”按钮时获得覆盖屏幕的覆盖层-我想这应该是相当普遍/简单的,但是在实现它时仍然有问题。 我当前的设置是: TiledMapRenderer:渲染TMX切片(背景/
什么是应用亮度和对比度的简单像素着色器脚本效果? 我找到了这个,但它似乎不正确: sampler2D input : register(s0); float brightness : register
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在编写一个 PixelShader(HLSL、SM40)并尝试在某些情况下完全跳过输出。我当前的代码如下所示: float4 PS( PS_INPUT input) : SV_Target {
我有一个变量,可以是负数,也可以是正数。 确保其始终为正值的一种方法是: if (var < 0) var = -var; 但是,我认为必须有一个着色器函数可以做到这一点。我正在使用 Cg,但是如果我
就会出现标准 Assets 效应Screen Space Ambient Obscurance不适用于正交相机。这很奇怪,因为基本 SSAO脚本工作得很好。我怀疑问题在于片段深度的计算错误。 有没有办
我需要 CG 片段着色器方面的帮助。我有一个大纹理可以容纳所有瓷砖。我真的不知道从哪里开始。 现在,当四边形/ Sprite 超过一定大小时,我需要重复纹理,因为它是一个纹理。 最佳答案 0Matth
对于运行时生成的着色器代码,我有兴趣探索是否可以直接自动生成编译的 Metal 着色器语言 (MSL) 代码(如 .metallib 文件,并与 newLibraryWithData:error: 方
我正在编写一个 PixelShader(HLSL、SM40)并尝试在某些情况下完全跳过输出。我当前的代码如下所示: float4 PS( PS_INPUT input) : SV_Target {
我有一个变量,它可以是负数也可以是正数。 确保它始终为正的一种方法是: if (var < 0) var = -var; 但是,我认为必须有一个着色器函数可以做到这一点。我正在使用 Cg,但是如果我知
在像素着色器中,您可以丢弃一个像素,但我想即使是为每个像素调用的快速失败着色器也需要花费大量时间?顶点着色器有什么办法可以丢弃整个三角形......我很确定VS无法访问图元但是有什么技巧可以让我们得到
我是一名优秀的程序员,十分优秀!