2013-06-24 11 views
11

Znam how to draw round points przy użyciu ustalonego potoku. Jednak muszę zrobić to samo, używając nowoczesnego OpenGL. Czy to możliwe, czy też powinienem użyć spitów punktowych i tekstur?Rysowanie punktów za pomocą nowoczesnego OpenGL

Dla interested.Here jak to odbywa się ze stałym rurociągiem:

 glEnable(GL_ALPHA_TEST); 
    glAlphaFunc(GL_NOTEQUAL, 0); 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    glEnable(GL_POINT_SMOOTH); 
    glPointSize(8.0); 

    glMatrixMode(GL_PROJECTION); 
    glLoadMatrixf(myMatrix); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadMatrixf(myAnotherMatrix); 

    glBegin(GL_POINTS); 
    glColor3f(1,1,1); 

    glVertex3fv(position); 


    glEnd(); 
    glDisable(GL_POINT_SMOOTH); 
    glBlendFunc(GL_NONE, GL_NONE); 
    glDisable(GL_BLEND); 
+0

Jak narysować okrągłe punkty za pomocą stałej rurociągu, chociaż, jeśli nie używając duszków punktowych i tekstur? Czy używasz 'glPointSize' razem z' GL_POINT_SMOOTH'? Nie sądzę, że kiedykolwiek była to wiarygodna metoda. –

+0

Istnieje hack;) Zobacz aktualizację. –

Odpowiedz

7
+0

Właściwie to zapytałem, czy jest to możliwe bez robienia vodoo w shaderów ... Ale +1 dla linków :) –

+4

W nowoczesnym OpenGL * nic * nie jest możliwe bez * niczego * w shaderów. Wolałbym nazwać dziwne zachowanie 'GL_POINT_SMOOTH' voodoo. –

+0

"voodoo w shaderów" - nie w jaki sposób powinieneś o tym myśleć, a nie tylko w odniesieniu do rysowania kręgów. Lepiej skorzystaj z programu, bo tak to robi się od tego momentu. Naprawiono funkcję * starszą wersję * –

7

Jednym ze sposobów byłoby narysować ikonek punkt z okręgu-faktury i self-made testu alfa w cieniującego fragmentu:

uniform sampler2D circle; 

void main() 
{ 
    if(texture(circle, gl_PointCoord).r < 0.5) 
     discard; 
    ... 
} 

Ale w rzeczywistości nawet nie potrzebują teksturę to, ponieważ krąg jest dość dobrze zdefiniowaną matematyczną koncepcją. Więc po prostu sprawdzić tylko gl_PointCoord, który mówi w której części [0,1] placu reprezentujących cały punkt bieżący fragment brzmi:

vec2 coord = gl_PointCoord - vec2(0.5); //from [0,1] to [-0.5,0.5] 
if(length(coord) > 0.5)     //outside of circle radius? 
    discard; 
+0

Dlaczego potrzebuję samodzielnie wykonanego testu alfa? Jeśli tekstura pochodzi z alfa wystarczy sprzętowe mieszanie alfa. Czy nie powinien? –

+0

@MichaelIV Ale testy alfa są przestarzałe i nie stanowią już części profilu podstawowego. Możliwe, że mieszanie alfa jest dla ciebie wystarczające, ale zwykle testowanie alfa byłoby preferowane, jeśli to możliwe, ponieważ nie zanieczyszcza bufora głębi za pomocą "niewidocznych" fragmentów (i może być nieco szybsze, ponieważ "odrzuć" jest wczesnym wyjściem). I tak jak powiedziałem, metoda bez tekstury byłaby i tak lepsza. –

+0

@MichaelIV Wyobraź sobie, że chcesz narysować wiele nieprzejrzystych, ale okrągłych cząstek (np. Czas konfetti!). Używając testów alfa zamiast tylko mieszania alfa, nie ma potrzeby dokładnego sortowania cząstek. Jeśli mimo to cząstki są przezroczyste, nadal trzeba je posortować i użyć mieszania alfa, więc może nie być poprawy funkcjonalności od "odrzucenia". –

Powiązane problemy