2013-04-08 22 views
5

Próbuję zrobić trójkąt, jak ten w prawo na poniższym rysunku:Triangle Gradient na OpenGL

triangles

Problemem jest to, że to, co chcę osiągnąć jest gradient kolorów z vertexes 1 i 2 proyected z C.

O ile mi wiadomo, nie jest to możliwe, ponieważ wierzchołek C musi mieć swój własny kolor, który również będzie mieszał się z kolorami 1 i 2, jak w lewym trójkącie obrazu . Jeśli ustawię C na kolor środkowy, generuje to niepożądany efekt, ponieważ im wyższy trójkąt, tym mniej zauważalne są kolory innych wierzchołków.

Linia C1 powinna być czarna, a linia C2 biała.

Czy jest jakiś sposób osiągnięcia tego w OpenGL?

Odpowiedz

6

Istnieją dwa sposoby, ale nie wiem, który ma sens dla twojej aplikacji. Na bardzo wysokim poziomie:

  1. Mapowanie tekstury do trójkąta. Ponieważ gradient jest bardzo gładki, nie musi mieć bardzo wysokiej rozdzielczości, a filtrowanie liniowe może wykonać za Ciebie.

  2. Użyj modułu cieniującego. Więcej pracy, aby skonfigurować, ale także bardziej elastyczny i daje "idealny" wynik w dowolnej skali/rozdzielczości.


Aktualizacja: jeśli masz zamiar użyć modułu cieniującego, pomysł jest następujący.

Przekaż varying vec2 coords z modułu cieniującego wierzchołka do modułu cieniującego fragmentu. Ustaw wartość dla punktu 1 na 0,0, dla punktu 2 na 1,0, a dla punktu C na 0,1. Aby uzyskać te wartości w module cieniującym wierzchołków, należy użyć wartości attribute. Różne wartości będą interpolowane w trójkącie, podobnie jak współrzędne tekstury i kolory. Tak zmienna coords jest mapowany do trójkąta tak:

y 
1 +-----+ 
    |\ | 
    |#\ | 
    |##\ | 
    |###\ | 
    |####\| 
0 +-----+ x 
    0  1 

Fragment shader otrzymuje wartość coords gdzieś wewnątrz obszaru zakodowanej. Aby dowiedzieć się, ile każdego koloru trzeba zmieszać, obliczyć linię przez coords i 0,1 i znaleźć jej przecięcie z osią x. Dzięki układowi współrzędnych coords jest to prosta operacja: wystarczy podzielić coords.x przez coords.y. Zadzwoń pod numer f. (Zauważ, że da to podział przez zero w punkcie C, ale jest to oczekiwane, ponieważ nigdy nie zdefiniowałeś tamtego koloru.Możesz to sprawdzić jawnie w module cieniującym, jeśli chcesz.)

Wskazując coords z c i przedstawiając linia z . znaków f kończy się gdzieś pomiędzy 0 i 1:

y 
1 +-----+ 
    |\ | 
    |.\ | 
    |#c\ | 
    |#.#\ | 
    |##.#\| 
0 +--f--+ x 
    0  1 

teraz powiedzmy masz uniform vec4 colour1 i uniform vec4 colour2 zdefiniować kolor w pkt 1 i 2, odpowiednio.Wtedy jest to prosta sprawa: zmieszanie jednej frakcji: f z colour1 i dodanie ich razem. Funkcja GLSL mix robi dokładnie to.

+0

Ponieważ trójkąt zmieni się dynamicznie, wydaje się, że pierwsza opcja prawdopodobnie nie pasuje. Co do shaderów, czy powinienem używać vertex shadera, aby przekazać zmienną wartość do wierzchołka fragmentu? Do tej pory używałem tylko modułu do cieniowania wierzchołków, a po zapoznaniu się z samouczkiem nie mogę jeszcze dowiedzieć się, w jaki sposób działa przekazywanie zmiennych wartości z werteksowego shadwera. – Leo

+0

Nadal może: struktura będzie rozciągać się wraz z geometrią. – Thomas

+0

Przepraszamy za szybką edycję. Nie zdawałem sobie sprawy, że naciśnięcie klawisza enter spowoduje przesłanie komentarza. – Leo