2011-09-23 7 views
5

Po prostu trzeba znaleźć sposób, używając Pixel Shader, do wyświetlania tekstury na arbitralnie zdefiniowanym kwadraturze zdefiniowanej przez użytkownika.Moduł cieniujący pikseli do rzutowania tekstury na arbitralny czworobok:

Będzie przyjmujący współrzędne czterech boków czworokąta:

/// <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); 

Próbowałem kilka algorytm interpolacji, ale nie udało się zrobić to dobrze.

Czy jest jakaś próbka, którą myślicie, którą mógłbym zmodyfikować, aby uzyskać pożądany rezultat?

Odpowiedz

1

Istnieje nice paper here opisujący twoje opcje (lub to .ppt). Zasadniczo musisz zdefiniować pewne współrzędne barycentryczne w kwadracie, a następnie interpolować wartości fragmentów jako sumy ważone BC dla danej wartości wierzchołków.

Niestety, nie znam żadnego kodu; brak bezpośredniego wsparcia dla quadów na nowoczesnych HW w trójkątach (patrz odpowiedź voidstar69) oznacza, że ​​raczej wyszli z mody.

1

Problem polega na tym, że wszystkie nowoczesne urządzenia graficzne 3D rasteryzują trójkąty, a nie czworokąty. Jeśli więc poprosisz Direct3D lub OpenGL o renderowanie quada, API wewnętrznie podzieli quad na dwa trójkąty. Zazwyczaj nie stanowi to problemu, ponieważ wszystkie współczesne renderowania są poprawne pod względem perspektywy, więc widz nie powinien być w stanie odróżnić jednego kwadratu od dwóch trójkątów - interpolacja będzie płynna.

Poprawnym sposobem, aby poprosić API o wykonanie tej interpolacji, jest przekazanie jej współrzędnych tekstury jako danych na wierzchołek, które interfejs API/sprzęt będzie interpolować w każdym pikselu. Twój moduł cieniujący pikseli będzie wtedy miał dostęp do współrzędnych tekstury na piksel. Zakładam, że kiedy używasz terminu "projekt", masz na myśli po prostu odwzorowanie prostokątnej tekstury na quad i nie odnosi się to do projekcji tekstury (która jest jak reflektor, który rzuca teksturę na powierzchnie).

Najważniejsze jest to, że podanie współrzędnych tekstury kwadratu do modułu cieniującego pikseli jest niewłaściwe (chyba że masz jakiś specjalny powód, dla którego jest to wymagane).

+0

To wszystko prawda ... ale całkowicie możliwe jest całkowite pominięcie interpolatorów opartych na trójkątach HW i zdefiniowanie własnego schematu na quadach lub wielokątach lub bardziej złożonych elementach, nawet pod warunkiem, że można podzielić ich ślady na trójkąty i uzyskać każdy piksel shadera potrzebnych informacji (w szczególności pozycji i wartości wszystkich pozostałych wierzchołków, a nie tylko lokalnego trójkąta). Oczywiście nie jest to szczególnie skuteczny sposób robienia rzeczy w porównaniu z dedykowaną obsługą interpolacji trójkąta, ale to nie znaczy, że nie ma aplikacji. – timday

+1

Na plakacie nie określono, czy próbują skorzystać z interpolacji HW, czy z boku. Zgadzam się, że oba są możliwe. Myślę, że pierwotne pytanie wymaga wyjaśnienia i podania bardziej szczegółowych informacji. – voidstar69

Powiązane problemy