首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >金属着色器输出数据(GPGPU)

金属着色器输出数据(GPGPU)
EN

Stack Overflow用户
提问于 2018-01-18 01:29:22
回答 1查看 581关注 0票数 1

我正在尝试在ios上实现一些图像检测算法,我需要一些数据准备,这些数据应该作为着色器(Metal)工作,所以它应该传递带有结果数据的输出数组。

小例子: SWIFT

代码语言:javascript
复制
...
// Create buffer
var resultBuffer = device.makeBuffer(length: SIZE * MemoryLayout<Int32>.size, options: .storageModeShared)!

// Set buffer to encoder
computeCommandEncoder?.setBuffer(resultBuffer, offset: 0, index: 0)
...
// Call shader
commandBuffer.commit()
commandBuffer.waitUntilCompleted()

// Print first element for test
var p = resultBuffer.contents()
let first = p.load(as: UInt32.self)
print("first = \(first)")

MSL (金属着色器)

代码语言:javascript
复制
...
kernel void preparation(
  texture2d<float, access::read> inTexture [[texture(0)]], // Input texture

  texture2d<float, access::write> outTexture [[texture(1)]], // Output texture
  device uint* result [[ buffer(0) ]], // Output buffer
                uint2 gid [[thread_position_in_grid]])
{
    result[0] = 5; // Just for test set first element to 5
    float4 colorAtPixel = inTexture.read(gid);
    outTexture.write(colorAtPixel, gid); // Copy color from input texture to output texture
}

所以我希望它能打印出来

代码语言:javascript
复制
first = 5

但它会打印

代码语言:javascript
复制
first = 0

所以看起来着色器不会改变缓冲区内容?有什么办法能让它工作吗?

PS I使用iOs 11.2、iPhone 5S、XCode 9.2

EN

回答 1

Stack Overflow用户

发布于 2018-02-01 06:10:27

您正在尝试从线程组中的每个像素写入相同的输出内存位置。如果您正在写入内存位置,则必须特别注意,对于由每个gid元素标识的每个像素,只需写入一个内存位置。更好的方法是从输入纹理读取并写入每个像素的输出纹理,只需移除uint*结果缓冲区并直接使用纹理,您的头疼就会消失。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48306801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档