Пиксельный шейдер для проецирования текстуры в произвольный четырехугольник - PullRequest
5 голосов
/ 23 сентября 2011

Просто нужно найти способ, используя Pixel Shader, проецировать текстуру в произвольный четырехугольник, определенный пользователем.

Будет принимать координаты четырех сторон четырехугольника:

/// <defaultValue>0,0</defaultValue>
float2 TopLeft : register(c0);

/// <defaultValue>1,0</defaultValue>
float2 TopRight : register(c1);

/// <defaultValue>0,1</defaultValue>
float2 BottomLeft : register(c2);

/// <defaultValue>1,1</defaultValue>
float2 BottomRight : register(c3);

Попробовал пару алгоритмов интерполяции, но не смог сделать это правильно.

Есть ли у вас, как вы думаете, образец, который я мог бы изменить, чтобы получить желаемый результат?

Ответы [ 2 ]

1 голос
/ 03 октября 2011

Проблема здесь в том, что все современное оборудование для трехмерной графики растеризует треугольники, а не четырехугольники.Поэтому, если вы попросите Direct3D или OpenGL визуализировать квад, API внутренне разделит квад на два треугольника.Обычно это не проблема, так как весь современный рендеринг является корректным с точки зрения перспективы, поэтому зритель не должен иметь возможность различить один квад и два треугольника - интерполяция будет бесшовной.API для выполнения этой интерполяции - это передача координат текстуры в виде данных на каждую вершину, которые API / аппаратные средства будут интерполировать по каждому пикселю.Ваш пиксельный шейдер получит доступ к этой координате текстуры на пиксель.Я предполагаю, что когда вы используете термин «проект», вы имеете в виду просто отображение прямоугольной текстуры на квад, и вы не имеете в виду проекцию текстуры (которая похожа на прожектор, освещающий текстуру на поверхности).Суть в том, что передача координат текстуры квада в пиксельный шейдер - неправильный подход (если у вас нет особых причин, почему это требуется).

1 голос
/ 03 октября 2011

Здесь есть хорошая статья , описывающая ваши варианты (или это .ppt ). По сути, вам нужно определить некоторые барицентрические координаты по всему квадру, а затем интерполировать значения фрагментов в виде взвешенных по BC сумм заданных значений вершин.

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

...