LINUX.ORG.RU
ФорумTalks

Объясните один момент в OpenGL

 , ,


0

1

Ему же плевать какой формат текстур ему подсовывают, главное чтобы был декодер для этого формата? К примеру если я возьму какой-нибудь Принципиально Новый формат текстуры, возьму библиотеку этого формата, подключу к опенжл, то все заработает? Или нет?


OpenGL знать не знает, в каком формате была картинка до того, как ты её декодировал и подсунул в качестве текстуры. Или я не так понял вокрос?

Psych218 ★★★★★
()
Ответ на: комментарий от Psych218

Вопрос понят правильно, да.

Спасибо за ответ. Ибо я слышал про кучу форматов сжатия текстур, и задался вопросом, а что если я возьму нестандартный формат изображения(текстуры) и засуну его в OpenGL.

ozzee
() автор топика

Вулканизируйся! OpenGL имеет свой формат. Про всякие JPEG или PNG он не в курсе и ему насрать.

Stahl ★★☆
()
Ответ на: комментарий от ozzee

Энивей нужно в bmp-like байтики декодировать перед тем как opengl кормить.

Kuzy ★★★
()
Ответ на: комментарий от ozzee

OpenGL изначально принимал текстуры в виде простой карты пикселей. Потом появилась поддержка сжатия, причём текстуры на видеокарте так и остаются сжатыми, просто формат сжатия обеспечивает сравнительно быстрый доступ к произвольным пикселям (a.k.a. random-access).

Это совсем не то же самое, что PNG, JPEG или WebP. Файловые форматы расчитаны на сжатое хранение в файле и передачу по сети, но графическая программа потом всё равно распакует тот же PNG в памяти в простую карту пикселей.

В итоге те же текстуры в формате `.pvr.gz` сжаты из карты пикселей сначала как PVR, а потом алгоритмом GZip. После распаковки в памяти видекарты они останутся в сжатом формате PVR. И получается, что на диске `.pvr.gz` будет весить больше аналогичного JPEG, а после распаковки в видеопамять будет весить меньше.

Декодер файловых форматов программа ищет где-то сама, иногда через внешние API типа GDI+ или системного libpng. Декодер текстурного формата должен быть готов в видеодрайвере. В линуксе декодер обычно предоставляет открытая Mesa или же проприетарый драйвер NVIDIA, в рамках общей реализации OpenGL.

quiet_readonly ★★★★
()
Ответ на: комментарий от quiet_readonly

Спасибо большое за развернутый ответ. То есть если я сделаю свой принципиально новый формат текстур, где будет указано какой пиксель какого цвета, я смогу его так же использовать в OpenGL? Т.е. чтобы он тоже использовался как карта пикселей. Просто если с моделями все понятно, в том смысле что там просто рисуются полигоны, то с текстурами я не совсем понял.

ozzee
() автор топика
Ответ на: комментарий от ozzee

Ты должен будешь написать код, который бы парсил твой «принципиально новый» формат и отдавал карту пикселей, корректную для OpenGL, чтобы её можно было сунуть в качестве GLvoid * в void glTexImage2D(GLenum target​, GLint level​, GLint internalFormat​, GLsizei width​, GLsizei height​, GLint border​, GLenum format​, GLenum type​, const GLvoid * data​);

EXL ★★★★★
()
Ответ на: комментарий от ozzee

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

atrus ★★★★★
()

Насколько я знаю, OpenGL умеет в свои сжатые текстуры, вроде DXT. Вообще нет смысла в своем особом формате текстур.

peregrine ★★★★★
()

Для OpenGL вообще пофиг что лежит в текстурном буфере, во фрагментном шейдере ты можешь это интерпретировать как угодно.

hlamotron
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.