C++, OpenGL, SDL2 - Не правильно рисуеться часть текстуры!

Хочу нариосвать часть текстуры на языке OpenGL, но она не правильно рисуеться!

Код:

#include <SDL2/SDL.h>
#include <SDL2/SDL_opengl.h>
#include <SDL2/SDL_image.h>
#include <string>
using namespace std;

SDL_Window *window;
SDL_Event event;

GLuint *textures;

SDL_Surface *texture;

long double xx=0, yy=0, widthw=1, heighth=1;

void setTextureCount(int count){
    textures=new GLuint[count];
    glGenTextures(count, textures);
}

int currentTexture=0, id=0, mode=0;

void loadTexture(std::string path){
    texture=IMG_Load(path.c_str());

    if(texture->format->Amask)
        mode=GL_RGBA;
    else
        mode=GL_RGB;

    id=currentTexture;
    glBindTexture(GL_TEXTURE_2D, textures[currentTexture]);
    currentTexture++;

    glTexImage2D(GL_TEXTURE_2D, 0, mode, texture->w, texture->h, 
                    0, mode, GL_UNSIGNED_BYTE, texture->pixels);

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
}

void setTextureRect(int x, int y,
                    int width, int height){
    long double test1=x, test2=y, test3=width, test4=height;                    
    if((long double)x!=0)
        xx=(long double)test1/texture->w;
    if((long double)y!=0)
        yy=(long double)test2/texture->h;
    widthw=(long double)(test3/texture->w)+xx;
    heighth=(long double)(test4/texture->h)+yy;
}

void displayTexture(){
    glPushMatrix();
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    glTranslatef(0, 0, 0);
    glBindTexture(GL_TEXTURE_2D, textures[id]);
    glBegin(GL_QUADS);
        glColor3f(255, 255, 255);
        glTexCoord2d(xx, yy); glVertex2f(0, 0);
        glTexCoord2d(widthw, yy); glVertex2f(texture->w, 0);
        glTexCoord2d(widthw, heighth); glVertex2f(texture->w, texture->h);
        glTexCoord2d(xx, heighth); glVertex2f(0, texture->h);
    glEnd();

    glDisable(GL_BLEND);
    glDisable(GL_TEXTURE_2D);
    glPopMatrix();
}

int main(){
    window=SDL_CreateWindow("Window", SDL_WINDOWPOS_CENTERED, 
        SDL_WINDOWPOS_CENTERED, 800, 800, SDL_WINDOW_OPENGL);

    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);

    SDL_GLContext context=SDL_GL_CreateContext(window);

    SDL_GL_SetSwapInterval(SDL_FALSE);

    setTextureCount(0);

    loadTexture("unnamed.jpg");

    setTextureRect(9, 12, 63, 77);

    while(window!=NULL){
        while(SDL_PollEvent(&event)){
            if(event.type==SDL_QUIT)
                window=NULL;
            if(event.key.keysym.scancode==SDL_SCANCODE_ESCAPE)
                window=NULL;
        }

        glClearColor(0, 0, 0, 0);
        glClear(GL_COLOR_BUFFER_BIT);

        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(0, 800, 800, 0, -10, 10);

        displayTexture();

        SDL_GL_SwapWindow(window);
    }
}

Не правильное:

введите сюда описание изображения

Правильное:

введите сюда описание изображения

Как нарисовать часть текстуры правильно?


Ответы (1 шт):

Автор решения: just_a_noob

исправь для начала:

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);

на:

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

чтобы было:

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

и потом, чтобы отобразить текстуру на квадрате, не обязательно знать размер текстуры, напиши так:

glBegin(GL_QUADS);
    glColor3f(255, 255, 255);
    glTexCoord2d(0.0, 0.0); glVertex2f(0, 0);
    glTexCoord2d(1.0, 0.0); glVertex2f(texture->w, 0);
    glTexCoord2d(1.0, 1.0); glVertex2f(texture->w, texture->h);
    glTexCoord2d(0.0, 1.0); glVertex2f(0, texture->h);
glEnd();

возможно, ты неправильно вводил текстурные кординаты, и еще функции glColor3f, glVertex2f и glTexCoord2d используют разные входные типы переменных, например: glColor3f - float, glColor3d - double, glColor3i - int, и glVertex2f, glTexCoord2f соответственно, а значения текстурных кординат надо использовать от 0.0 до 1.0, так как значение 0.0 по x - это левая сторона текстуры, 1.0 по x - правая, 0.0 по y - верхняя, 1.0 - нижняя.

→ Ссылка