Я хочу изменить географическую сетку с помощью текстуры в вершинном шейдере.
У меня есть рабочий металлический конвейер.
Я передаю MTLTexture
следующим образом:
commandEncoder.setVertexTexture(texture, index: 0)
commandEncoder.setVertexSamplerState(sampler, index: 0)
Моя функция вершинного шейдера:
vertex VertexOut distort3DVTX(const device VertexIn* vertecies [[ buffer(0) ]],
unsigned int vid [[ vertex_id ]],
texture2d<float> inTex [[ texture(0) ]],
sampler s [[ sampler(0) ]]) {
VertexIn vtxIn = vertecies[vid];
float x = vtxIn.position[0];
float y = vtxIn.position[1];
float u = x / 2 + 0.5;
float v = y / 2 + 0.5;
float2 uv = float2(u, v);
float4 c = inTex.sample(s, uv);
VertexOut vtxOut;
vtxOut.position = float4(x + (c.r - 0.5), y + (c.g - 0.5), 0, 1);
vtxOut.texCoord = vtxIn.texCoord;
return vtxOut;
}
Я вижу эту ошибку:
Выполнение буфера команд было прервано из-за ошибки во время выполнения,Сброшен (жертва ошибки / восстановления GPU) (код IOAF 5)
Если я заменим float4 c = inTex.sample(s, uv);
на float4 c = 0.5;
, я не увижу ошибку.Так что это определенно что-то с выборкой текстуры ...
Любая идея, как решить IOAF code 5
?
Обновление 1:
Код ошибкиКажется, что доза не связана с текстурой, то же самое происходит, когда я пытаюсь передать однородный буфер ...
const device Uniforms& in [[ buffer(1) ]]
Обновление 2:
ПравитьСхема -> Выполнить -> Параметры -> Захват кадров графического процессора -> Металл
Ранее у меня было установлено значение Automatically Enabled
.
Теперь я получаю соответствующие журналы ошибок:
Поток 1: сигнал SIGABRT
validateFunctionArguments: 3469: сбой утверждения `Функция вершины (icle3DVTX): отсутствует привязка буфера к индексу 1 для in in [0]. '
ThoУ меня сбой до того, как я drawPrimitives
или endEncoding
...
Обновление 3:
Вот как я передаю унифицированные значения:
var vertexUnifroms: [Float] = ...
let size = MemoryLayout<Float>.size * vertexUnifroms.count
guard let uniformsBuffer = metalDevice.makeBuffer(length: size, options: []) else {
commandEncoder.endEncoding()
throw RenderError.uniformsBuffer
}
let bufferPointer = uniformsBuffer.contents()
memcpy(bufferPointer, &vertexUnifroms, size)
commandEncoder.setVertexBuffer(uniformsBuffer, offset: 0, index: 1)
Обновление 4:
Очистка помогла.Теперь я вижу, где он падает;drawPrimitives
.Мой vertexUnifroms
был пуст, исправил ошибку, и теперь у меня есть униформа!