2012-12-18 10 views
9

Nie tak dawno temu miałem problem z wyświetlaniem tekstury, ponieważ używałem krawędzi tekseli jako współrzędnych tekstury zamiast centrów tekseli. To, w połączeniu z liniowym mieszaniem, dawało gładki efekt kolorów zamiast czystych kolorów nadanych przez teksturę.Pobieranie próbek w centrach texel nie daje właściwych rezultatów, OpenGL, C++

Dzięki poradom udzielonym tutaj, myślałem, że mój problem został rozwiązany, ponieważ zacząłem używać centrów tekseli jako współrzędnych, ale działało to tylko w jednym przypadku i nie mam pojęcia, dlaczego tylko w tym jednym przypadku.

Jeszcze raz pokażę kilka zdjęć.

Jest to struktura używam (32x32 pikseli) z granicy 2 piksele:

enter image description here

Mój cały obiekt, który jest sporządzony składa się z 9 quadów, ale używają tylko jedną fakturę (ten, który pokazałem). Jednym z nich będzie służyć jako wyjaśnienie do mojego problemu:

enter image description here

myślę, że jest dobrze widoczne, że kolory tego quad nie są prawidłowo ustawione zgodnie z fakturą.

To wygląda na problem z mieszania, ale do ustawiania tekstury współrzędne Użyłem centra teksele, podobnie jak to:

glBegin(GL_QUADS); 
    // Bottom left 
    glTexCoord2f(0.0 + texelCentersOffset, maxTexCoordBorderY + texelCentersOffset); 
    glVertex2i(pos.x, pos.y + height - m_borderWidth); 

    // Top left 
    glTexCoord2f(0.0 + texelCentersOffset, (GLfloat)1.0 - maxTexCoordBorderY - texelCentersOffset); 
    glVertex2i(pos.x, pos.y + m_borderWidth); 

    // Top right 
    glTexCoord2f(maxTexCoordBorderX - texelCentersOffset, (GLfloat)1.0 - maxTexCoordBorderY - texelCentersOffset); 
    glVertex2i(pos.x + m_borderWidth, pos.y + m_borderWidth); 

    // Bottom right 
    glTexCoord2f(maxTexCoordBorderX - texelCentersOffset, maxTexCoordBorderY + texelCentersOffset); 
    glVertex2i(pos.x + m_borderWidth, pos.y + height - m_borderWidth); 
glEnd(); 

Dla wyjaśnienia:

m_borderWidth = 2

maxTexCoordBorderX = maxTexCoordBorderY = 2/32 = 0,0625

texelCentersOffset = 1/64 = 0,015625

Czy ktoś może mi powiedzieć, co jest nie tak w tym, co napisałem?

Edit1:

Oto ustawienia dla mojego Tekstura:

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, 
       GL_LINEAR_MIPMAP_NEAREST); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, 
        GL_REPEAT); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, 
        GL_REPEAT); 
gluBuild2DMipmaps(GL_TEXTURE_2D, 4, m_width, m_height, 
        GL_RGBA, GL_UNSIGNED_BYTE, pixmap); 

Kiedy zmienić GL_LINEAR do GL_NEAREST, to działa poprawnie, więc jest to oczywiście problem z mieszania, ale nadal nie można dowiedzieć się, dlaczego jest źle.

EDIT2:

Kiedy zwiększyć wysokość quad być taka sama lub większa niż wysokość tekstury jest, to działa poprawnie bez zmiany współrzędnych tekstur.

+0

Gdzie ustawiasz macierze rzutowania i modelowania? Jaka jest wartość "pos"? – genpfault

+0

@genpfault pos.x i poz.y mają wartość 0, więc można je pominąć. Macierze są ustawione na początku w następujący sposób: glViewport (0, 0, szerokość, wysokość); // Resetuj bieżącą rzutnię glMatrixMode (GL_PROJECTION); // Wybierz macierz projekcyjną glLoadIdentity(); \t \t \t \t \t \t \t \t \t // czyść macierz projekcji \t glOrtho (0,0, szerokość, wysokość, 0,0, 0,0, 1,0); glMatrixMode (GL_MODELVIEW); \t \t \t \t \t \t // Wybierz matrycę ModelView glLoadIdentity(); \t \t \t \t \t \t \t \t \t // Reset ModelView Matrix –

+0

nie należy próbować przypisać centra Texel do wierzchołków. To, czego naprawdę chcesz, to tekle, które mają być wycentrowane na wynikowych fragmentach * po * rasteryzacji. Napisałem ładną odpowiedź (z obrazami do wyjaśnienia) tutaj, może przeczytanie tego pomoże ci zrozumieć: http://stackoverflow.com/a/11458037/1236185 – Tim

Odpowiedz

1

Wydaje mi się, że gdy ustawisz rozmiar kwadratu mniejszy niż rozmiar tekstury. Musi pobrać próbkę tekstury za pomocą mipmapy.

Mipmapy wykonuje się przez uśrednienie 4 bloków tekselowych. Tak więc, gdy próbujesz mipmap, otrzymujesz informacje z więcej niż jednego texela. Tak więc, dzięki temu, że twój quad jest mniejszy niż tekstura, musi wypróbować mipmapę i dostajesz krwawienie z tekstury. Wyłącz mipmapping i domyślam się, że zniknie.

+0

Przepraszam za spóźnioną odpowiedź, ale tak, to był problem. Dziękuję, Tocs! –

Powiązane problemy