3

ドキュメントを読んで理解したところ、3D テクスチャには 1 つのスライスしかありません。ただし、データをロードしようとすると、次のエラーで失敗します。

MTLTexture.m:504: failed assertion `imageBytes(0) must be >= (2048).'

ロードに使用されるコードは次のとおりです (テクスチャは typeMTLPixelFormatRG16Uintと size ですelementsInRow * elementsInRow * elementsInRow):

[texture replaceRegion:region mipmapLevel:0 withBytes:data bytesPerRow:sizeof(uint16_t) * 2 * elementsInRow];

ここでelementsInRow128、地域はMTLRegion region = MTLRegionMake3D(50, 50, 50, 4, 4, 4);、データはuint16_t data[region.size.depth][region.size.height][region.size.width][2]です。

私も試しました:

[texture replaceRegion:region mipmapLevel:0 slice:0 data bytesPerRow:sizeof(uint16_t) * 2 * elementsInRow bytesPerImage:sizeof(uint16_t) * 2 * elementsInRow * elementsInRow];

しかし、メモリエラーが発生します。

こちらもご覧ください: https://forums.developer.apple.com/message/43332#43332

3D テクスチャの 3D 領域にデータを正しくロードするにはどうすればよいですか?

更新 1:

2 番目の例は、領域に深さが1あり、さらに大きい場合に機能widthしますheight(ただし、これを使用32x32x1するとクラッシュします)。

更新 2:

領域内のすべてのピクセルに同じ値を使用16x16x1して書き込むと、うまくいくように見えますが、データを画像としてエクスポートすると、代わりにランダム データが書き込まれているように見えます。画像の拡大されたセクションを参照してください。

ここに画像の説明を入力

テストを再度実行すると、画像の上部のセクションは均一な色になりますが、残りのポイントは強度が変わります。すべてのピクセルに同じ値を書き込んでいることに注意してください。したがって、領域は均一な色でなければなりません。

4

1 に答える 1

3

それだけでした。bytesPerRowおよびbytesPerImageパラメータが正しくないため、境界メモリの外側から読み取ろうとしていました。

ドキュメントには次のように記載されています。

bytesPerRow
通常またはパック ピクセル形式の場合、ソースデータの行間のストライド (バイト単位)。

bytesPerImageソースデータ
内のイメージ間のストライド (バイト単位) 。

regionではなくtextureを参照していると考えて値を渡していました。

したがって、コードは次のようになります。

[texture replaceRegion:region mipmapLevel:0 slice:0 data bytesPerRow:sizeof(uint16_t) * 2 * region.size.width bytesPerImage:sizeof(uint16_t) * 2 * region.size.width * region.size.height];

ドキュメントを十分に注意深く読むことはできません。

于 2015-08-20T19:32:41.883 に答える