SDL2 с некорректно отображаемой текстурой OpenGL

Я искал это, но, к сожалению, единственные ответы, которые я нахожу, это те, которые имеют дело с проблемой не отображаемых текстур, в этом случае текстура отображается, но не похожа на загруженную поверхность.

В любом случае, игнорируя тот факт, что мощность двух квадратных изображений не требуется (что я пока не изучил должным образом), я создал функциональный скрипт для расширения поверхности до степени двух измерений и структуру для хранения измененных размеров. поверхность, старые размеры поверхности и идентификатор текстуры.

Мой код поверхности к текстуре (аргументы: SDL_Surface * surf, antTex * tex):

tex->w=surf->w;
tex->h=surf->h;
tex->surf=resizeToNearestPow2(surf);
glGenTextures(1, &tex->id);
glBindTexture(GL_TEXTURE_2D, tex->id);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex->surf->w, tex->surf->h, 0, GL_BGRA, GL_UNSIGNED_BYTE, tex->surf->pixels);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glBindTexture(GL_TEXTURE_2D, NULL);

Структура antTex это:

GLuint id;          //Texture ID
int w, h;           //Original Image Size
int rw, rh;         //Resized Canvas Size
SDL_Surface* surf;  //Resized Surface

Кажется, все в изменении размера изображения работает нормально (использовав функцию SDL_SaveBMP SDL для проверки полученного изображения), я использовал IMG_Load SDL2_image.h для загрузки исходного изображения.

Когда я рисую плоскость с отображенной на нее текстурой, когда включен GL_BLEND, ничего не появляется вообще, когда я отключаю ее, я получаю это (красный — цвет фона окна):

http://i1200.photobucket.com/albums/bb336/DarknessXeagle/error_zps03e1e5a1.png

Исходное изображение было таким:

http://i1200.photobucket.com/albums/bb336/DarknessXeagle/d_zpsc8b9af6f.png

Это моя функция для рисования плоскости с отображенной на ней текстурой (аргументы: antTex * tex, int x, int y):

glBindTexture(GL_TEXTURE_2D, tex->id);
int w, h;
w=tex->w;
h=tex->h;
GLfloat tw, th;
th=(GLfloat)tex->h/(GLfloat)tex->rh;
tw=(GLfloat)tex->w/(GLfloat)tex->rw;
glPushMatrix();
glTranslatef(x, y, 0);
glBegin(GL_QUADS);
glNormal3f(0, 0, 1);
glTexCoord2f(0, th);    glVertex2f(0, h);
glTexCoord2f(tw, th);   glVertex2f(w, h);
glTexCoord2f(tw, 0);    glVertex2f(w, 0);
glTexCoord2f(0, 0);     glVertex2f(0, 0);
glEnd();
glPopMatrix();
glBindTexture(GL_TEXTURE_2D, NULL);

0

Решение

У вас проблема с передачей координат u и v для рендеринга текстуры в квад с помощью glTexCoord2f.

Вам нужно изменить:

glTexCoord2f(0, th);    glVertex2f(0, h);
glTexCoord2f(tw, th);   glVertex2f(w, h);
glTexCoord2f(tw, 0);    glVertex2f(w, 0);
glTexCoord2f(0, 0);     glVertex2f(0, 0);

в:

glTexCoord2f(0, 1);    glVertex2f(0, h);
glTexCoord2f(1, 1);   glVertex2f(w, h);
glTexCoord2f(1, 0);    glVertex2f(w, 0);
glTexCoord2f(0, 0);     glVertex2f(0, 0);
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]