poniedziałek, 7 czerwca 2010

OpenGL i koordynaty pikseli

Aktualnie pracuję nad prościutką biblioteką do robienia graficznego interfejsu użytkownika. Potrzebna mi będzie do tworzenia kilku współpracujących ze sobą aplikacji. Jest to rozwiązanie "Immediate Mode", rysowanie odbywa się za pomocą OpenGL, natomiast świadomość urządzeń wejściowych uzyskana dzięki SDL.

No i jak to zwykle bywa natknąłem się na pewien problem. Otóż ramka rysowana wokół guzika była nie domknięta, brakowało lewego dolnego piksela.

Kod rysujacy ramkę:
glBegin(GL_LINE_LOOP);
    glVertex3f(vertexACoordX, vertexACoordY, 0.0f);
    glVertex3f(vertexBCoordX, vertexBCoordY, 0.0f);
    glVertex3f(vertexCCoordX, vertexCCoordY, 0.0f);
    glVertex3f(vertexDCoordX, vertexDCoordY, 0.0f);
glEnd();

Rozwiązanie znalazłem tutaj: link. Przy okazji wyszedł kolejny problem, faktycznie rozmiar ramki nie pokrywa się z tłem. Wychodzi na to, że trzeba sobie ręcznie poprzesuwać wierzchołki aby wszystko się ze sobą ładnie zgrało.

Wracając jednak do problemu, co jest przyczyną ? Podanie całkowitych wartości dla współrzędnych punktów sprawia, że rysujemy dokładnie pomiędzy dwoma pikselami. W celu uniknięcia tego problemu należy przesunąć współrzędne o wartość 0.5, alternatywnie możemy włączyć wygładzanie linii:

glEnable(GL_LINE_SMOOTH);

To drugie podejście owocuje niestety pogrubieniem naszej ramki.


Odkryłem też pewien zaskakujący brak w SDL, nie daje możliwości zmian położenia i rozmiaru okna. Znaczy da się to zrobić, ale wymaga samodzielnego wykonania czynności specyficznych dla danego OSu.

Brak komentarzy: