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:
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:
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.
Gdzie ustawiasz macierze rzutowania i modelowania? Jaka jest wartość "pos"? – genpfault
@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 –
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