glsl не отображаемые текстуры не отображаются - PullRequest
0 голосов
/ 06 мая 2018

Я успешно отображал текстуры на геометрии, используя свой собственный мини-конвейер (используя mipmaps), но я решил не использовать mip-карты, потому что моему программному обеспечению действительно не нужно изменять уровень детализации. Это 2d и использует пиксель-арт. Деталь не должна меняться. Я добавлю, что я пытаюсь зациклить текстуры в текстурном атласе, и отключение mip-mapping может помочь избежать проблем.

Однако, не вызывая glGenerateMipmap, вы получите пустой экран. Называя его, мы получаем правильную текстуру.

Есть ли другая функция, которую я должен вызывать вместо?

Ниже приведена моя функция генерации текстуры (я передаю указатель на уже созданный идентификатор текстуры).

GLboolean GL_texture_load(Texture* texture_id, const char* const path, const GLboolean alpha, const GLint param_edge)
{
    // load image
    SDL_Surface* img = nullptr; 
    if (!(img = IMG_Load(path))) {
        fprintf(stderr, "SDL_image could not be loaded %s, SDL_image Error: %s\n", 
               path, IMG_GetError());
        return GL_FALSE;
    }


    glBindTexture(GL_TEXTURE_2D, *texture_id);
    // image assignment
    GLuint format = (alpha) ? GL_RGBA : GL_RGB;
    glTexImage2D(GL_TEXTURE_2D, 0, format, img->w, img->h, 0, format, GL_UNSIGNED_BYTE, img->pixels);
    glGenerateMipmap(GL_TEXTURE_2D); // commenting this out yields a blank screen

    // wrapping behavior
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, param_edge);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, param_edge);
    // texture filtering
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); // I won't want these because the texture should have constant detail / resolution
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glBindTexture(GL_TEXTURE_2D, 0);
    // free the surface
    SDL_FreeSurface(img);

    return GL_TRUE;
}

Я использую SDL2_Image для файлов png, а размер текстуры не обязательно равен степени двойки. (Я пока не оптимизирую это.)

Чего мне не хватает? Какие параметры я должен установить только для рендеринга нефильтрованной текстуры? Я сомневаюсь, что mipmapping является обязательным требованием. Возможно ли, что без mipmapping я не смогу использовать sampler2D или texture () как обычно? Это было бы странно.

Заранее спасибо.

РЕДАКТИРОВАТЬ: BDL ответ помог. Для справки ниже приведен мой модифицированный код:

GLboolean GL_texture_load(Texture* texture_id, const char* const path, const GLboolean alpha, const GLint param_edge_x, const GLint param_edge_y)
{
    // load image
    SDL_Surface* img = nullptr; 
    if (!(img = IMG_Load(path))) {
        fprintf(stderr, "SDL_image could not be loaded %s, SDL_image Error: %s\n", 
               path, IMG_GetError());
        return GL_FALSE;
    }


    glBindTexture(GL_TEXTURE_2D, *texture_id);
    // image assignment
    GLuint format = (alpha) ? GL_RGBA : GL_RGB;
    glTexImage2D(GL_TEXTURE_2D, 0, format, img->w, img->h, 0, format, GL_UNSIGNED_BYTE, img->pixels);

    // wrapping behavior
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, param_edge_x);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, param_edge_y);
    // texture filtering
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glBindTexture(GL_TEXTURE_2D, 0);
    // free the surface
    SDL_FreeSurface(img);

    return GL_TRUE;
}

1 Ответ

0 голосов
/ 06 мая 2018

Требуются ли для текстуры мип-карты или нет, зависит от используемого режима фильтрации. При использовании режима фильтра с ..._MIPMAP_... должен быть доступен mipmap (независимо от того, доступен он или нет).

Если вам не нужны мип-карты, используйте GL_LINEAR или GL_NEAREST для GL_TEXTURE_MIN_FILTER. Для пиксельного взгляда вам, скорее всего, понадобится GL_NEAREST.

...