Как передать текстуру в вершинный шейдер?(iOS & Metal) (код IOAF 5) - PullRequest
0 голосов
/ 23 сентября 2018

Я хочу изменить географическую сетку с помощью текстуры в вершинном шейдере.

У меня есть рабочий металлический конвейер.

Я передаю 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 был пуст, исправил ошибку, и теперь у меня есть униформа!

1 Ответ

0 голосов
/ 23 января 2019

У меня была такая же проблема.Я обнаружил, что мне нужно установить байты буфера вершин с:

commandEncoder.setVertexBytes(&vertexUniforms, length: MemoryLayout<VertexUniforms>.size, index: 1)

... То же самое можно сделать и для байтов буфера фрагмента:

commandEncoder.setFragmentBytes(&fragmentUniforms, length: MemoryLayout<FragmentUniforms>.size, index: 1)
...