DirectX 11 Direct Texel Mapping

Я пытаюсь визуализировать текстуру в DirectX 11 (C ++ API) с использованием матрицы ортографической проекции. В горизонтальном измерении я использую преимущество «проекции», но в вертикальном измерении я хочу, чтобы мои вершины отображались непосредственно в определенную строку текселей.

Я создал текстуру 128х128. Я установил его в качестве цели рендеринга и настроил область просмотра следующим образом:

D3D11_VIEWPORT textureViewport;
textureViewport.TopLeftX = 0.0f;
textureViewport.TopLeftY = 0.0f;
textureViewport.Height = 128.0f;
textureViewport.Width = 128.0f;
textureViewport.MinDepth = 0.0f;
textureViewport.MaxDepth = 1.0f;

Я предоставляю матрицу проекции, созданную так:

XMMATRIX projection = XMMatrixOrthographicOffCenterLH(50.0f, 250.0f, 128.0f, 0.0f, 256.0f, 0.0f);

Обратите внимание, что мои левое и правое значения не соответствуют ширине моей текстуры, но значения снизу вверх соответствуют высоте. При этом я ожидал бы, что если мой вершинный шейдер преобразует координату со значением Y 0.0f, используя вышеуказанную матрицу проекции для SV_Position, он будет отрисован в верхнем ряду текстуры. Координата со значением Y 127.0f будет нарисована в нижнем ряду текстуры.

Однако после предоставления ему данных, которые я ожидал бы заполнить всю текстуру (я рисую много вершин в виде списка точек), нижний ряд моей текстуры остается пустым. И я заметил, что верхний ряд моей текстуры не содержит вершин, которые я ожидаю. Кажется, что все сдвинуто вверх (или частично).

Я прочитал страницу на Система координат DirectX 10, но я не должен полностью понимать это. Я подумал, что это говорит мне о том, что мне не нужно ничего компенсировать на 0,5, как это было бы в DirectX 9. Но, может быть, у меня это задом наперед?

Как правильно контролировать, к какой строке текселя привязываются мои вершины?

Я не знаю, является ли это каким-либо следствием, но отмечу, что я никогда не отрисовываю эту текстуру на экране. Я сохраняю текстуру в файл изображения.

0

Решение

Я решил эту проблему. Перечитав статью, на которую я ссылался в своем вопросе, я понял, что ранее неправильно понял систему координат. Если я изменю свою орфографическую матрицу следующим образом, мои вершины будут преобразованы так, чтобы они попадали прямо в центр строк текселя, а не на границу между строками текселя. Все данные теперь отрисовываются в текстуре по желанию, и у меня больше нет проблемы пустой нижней строки.

XMMATRIX projection = XMMatrixOrthographicOffCenterLH(50.0f, 250.0f, 127.5f, -0.5f, 256.0f, 0.0f);
0

Другие решения


По вопросам рекламы [email protected]