【发布时间】:2019-01-21 17:44:26
【问题描述】:
在金属着色器文件的片段函数中,有没有办法重新定义纹理的“边界”,以使样本认为它的归一化坐标是什么?
默认情况下,样本的值 0,0 是左上角的“像素”,而 1,1 是纹理的右下角“像素”。但是,我正在重新使用纹理进行绘图,并且在任何给定的渲染过程中,只有一部分纹理包含相关数据。
例如,在宽度:500 和高度:500 的纹理中,我可能只将数据复制到 0,0,250,250 区域。在我的片段函数中,我希望采样器将 1.0 的归一化坐标解释为 250 而不是 500。这可能吗?
我意识到我可以将采样器更改为使用像素寻址,但这会带来一些限制,如金属着色器规范中所述。
【问题讨论】:
-
你能创建另一个纹理与完整纹理共享相同的缓冲区,使用相同的
bytesPerRow,但更小的width和height? -
好吧,我想我可以创建新的纹理,但这是我希望避免的。这些纹理是从
CVMetalTextureCache回收的,CVPixelBufferRef由IOSurface支持,IOSurface的宽度和高度可以是任何值。IOSurface用于从 XPC 服务传送数据,而 XPC 服务只会写入它需要的区域内的 IOSurface。所以我希望我可以轻松地将我的采样器夹在纹理的那个区域,而不是创建一个新的纹理。 -
CVMetalTextureCacheCreateTextureFromImage是不是太贵了?您可以使用相同的CVPixelBufferRef来创建多个纹理。 -
好点。我没有考虑从同一个 CVPixelBuffer 制作多个纹理,但是再次查看 API,我没有看到一种方法来指定新纹理相对于源像素缓冲区的原点。 (有一个
width和height属性用于设置缓冲区的尺寸,但没有来源。)我想我只是假设使用 CVPixelBuffer 支持创建的任何纹理都应该具有相同的尺寸。
标签: objective-c macos metal metalkit