Я успешно отображал текстуры на геометрии, используя свой собственный мини-конвейер (используя 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;
}