Привязка нескольких текстур OpenGL к разным квадрам - PullRequest
2 голосов
/ 21 апреля 2019

Мне удалось заставить мою игру читать в формате PNG и успешно текстурировать мои объекты.Честно говоря, я не могу на 100% описать, как это работает на самом деле - и теперь я бы хотел расширить его до загрузки нескольких текстур и использования указанной мной.

Вот моя функция загрузки PNG:

//Loads PNG to texture
GLuint loadPNG(string name) {
    nv::Image img;
    GLuint myTextureID;

    if (img.loadImageFromFile(name.c_str())) {
        glGenTextures(1, &myTextureID);
        glBindTexture(GL_TEXTURE_2D, myTextureID);
        glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
        glTexImage2D(GL_TEXTURE_2D, 0, img.getInternalFormat(), img.getWidth(), img.getHeight(), 0, img.getFormat(), img.getType(), img.getLevel(0));
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, 16.0f);
    }
    else {
        MessageBox(NULL, L"Failed to load texture", L"Sorry!", MB_OK | MB_ICONINFORMATION);
    }
    return myTextureID;
}

В моей основной функции я определяю текстуру следующим образом:

//Load in player texture
testTexture = loadPNG("test.png");

, где testTexture - глобальная переменная типа GLuint.И рисование моих прямоугольников в моем основном цикле draw выполняется следующим образом:

//Used to draw rectangles
void drawRect(gameObject &p) {
    glEnable(GL_TEXTURE_2D);

    //Sets PNG transparent background
    glEnable(GL_BLEND);

    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    //glBindTexture(GL_TEXTURE_2D, myTexture);
    glBegin(GL_QUADS);
    glTexCoord2f(0.0, 0.0); glVertex2f(p.x, p.y);
    glTexCoord2f(1.0, 0.0); glVertex2f(p.x + p.width, p.y);
    glTexCoord2f(1.0, 1.0); glVertex2f(p.x + p.width, p.y + p.height);
    glTexCoord2f(0.0, 1.0); glVertex2f(p.x, p.y + p.height);
    glEnd();

    glDisable(GL_TEXTURE_2D);
}

Это прекрасно работает, текстурируя все мои объекты с определенной текстурой.Тем не менее, я хотел бы иметь возможность определять больше текстур и использовать их.Я попытался переместить:

glBindTexture(GL_TEXTURE_2D, myTextureID);

из функции loadPNG в мой drawRect, как:

glBindTexture(GL_TEXTURE_2D, testTexture);

Однакоэто не накладывает никакой текстуры вообще.Если у кого-то есть идеи, я бы очень признателен за помощь.Спасибо!

1 Ответ

4 голосов
/ 21 апреля 2019

Вы должны связать текстуру, чтобы инициализировать ее glTexImage2D.Не удаляйте звонок на glBindTexture из loadPNG.Если вы хотите выполнить рендеринг с другой текстурой, просто привяжите текстуру перед рендерингом четырехугольников.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...