Я пытаюсь визуализировать текстуру в 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. Но, может быть, у меня это задом наперед?
Как правильно контролировать, к какой строке текселя привязываются мои вершины?
Я не знаю, является ли это каким-либо следствием, но отмечу, что я никогда не отрисовываю эту текстуру на экране. Я сохраняю текстуру в файл изображения.
Я решил эту проблему. Перечитав статью, на которую я ссылался в своем вопросе, я понял, что ранее неправильно понял систему координат. Если я изменю свою орфографическую матрицу следующим образом, мои вершины будут преобразованы так, чтобы они попадали прямо в центр строк текселя, а не на границу между строками текселя. Все данные теперь отрисовываются в текстуре по желанию, и у меня больше нет проблемы пустой нижней строки.
XMMATRIX projection = XMMatrixOrthographicOffCenterLH(50.0f, 250.0f, 127.5f, -0.5f, 256.0f, 0.0f);