Zdecydowanie polecam używanie tekstur, jak powiedział Dave. Może to być trochę bolesne, ale myślę, że zapewniłoby znacznie lepszą wydajność.
Możesz spróbować wyszukać algorytmy wykrywania krawędzi . Jeśli utworzysz siatki za pomocą kolorowania wierzchołków jednolitymi kolorami i średnimi wartościami alfa (dla niewielkiej przezroczystości), a następnie użyjesz modułu cieniującego wykrywanie krawędzi, może to wyglądać wystarczająco dobrze. Nie byłoby tak samo, ale może ci się to jeszcze bardziej podobać; albo może nie.
W przeciwnym razie możesz patrzeć na rozwiązanie dwuprzebiegowe, rysując półprzezroczyste wielokąty (ponownie, ustaw kolory wierzchołków na jednolity kolor ze średnią wartością alfa), a następnie ustaw glPolygonMode (GL_LINE) i dostosuj glLineWidth zgodnie z potrzebami (być może w oparciu o obiekt odległość) i ponownie narysuj wielokąty.
Jest trochę późno i trudno mi się z tym zapoznać, ale dyskusja na forum wskazuje na ten PDF: Single-pass Rendering . Przepraszam, jeśli to nie ma znaczenia.
Wiem, że prawdopodobnie nie tego szukasz, ale wygląda na to, że Vector Tanks po prostu używa teksturowanych modeli. Tekstura nadaje ramce drucianej, działa na moim iPodzie touch, który nie obsługuje shaderów.
źródło
Jedyny sposób, w jaki to widziałem, to tekstury o wysokiej rozdzielczości, głównie czarne, takie jak te w Tron 2.0. Ich tekstury są prawie uniwersalnie albo płaską czernią z grubą, kolorową ramką, albo prostą teksturą szumu Perlina.
Zastosowali prostą obróbkę końcową, aby uzyskać efekt blasku.
źródło
Możesz wypróbować jakąś prostą funkcję odległości w module cieniującym piksele. Być może coś w rodzaju współrzędnych barycentrycznych (przechowuj różne RGB na wierzchołkach, a rasteriser wykona za ciebie większość pracy).
Wtedy twój moduł cieniujący pikseli będzie miał potrzebne informacje o tym, gdzie na wielokącie znajduje się bieżący piksel - w pobliżu wierzchołka, w pobliżu krawędzi lub w środku ...
Podejrzewam, że w praktyce łatwiej byłoby to teksturować.
źródło
A co powiesz na to: weź swój model i fazuj krawędzie, które mają się pojawiać jako kontury. Pokoloruj twarze, które zostały utworzone za pomocą jasnej, nieprzezroczystej zieleni, podczas gdy wszystkie stare twarze są ciemne, półprzezroczyste zielone.
Nie wymaga to wcale korzystania z shaderów pikseli. (W rzeczywistości nie ma też tekstur; po prostu kolory twarzy). Wymaga to wstępnego przetworzenia modelu z twojej strony, co może, ale nie musi być problemem.
Kontur nie będzie widoczny, gdy powierzchnia fazowana jest prostopadła do widoku. Jeśli Ci to przeszkadza, możesz nieco wyciągnąć fazowaną powierzchnię, kolorując wytłoczenie tak, jakbyś miał fazę. Możesz bawić się z różnymi stopniami fazowania i wytłaczania, aby tworzyć cieńsze i grubsze linie.
źródło