Ограничения видео-памяти OpenGL - PullRequest
2 голосов
/ 10 апреля 2010

Я пытался создать кроссплатформенную 2D онлайн-игру, и мои карты сделаны из плиток. Мой набор плиток, из которого я рендерил плитки, довольно большой. Я хотел знать, как я могу отключить аппаратный рендеринг или хотя бы сделать его более функциональным. Следовательно, я хотел знать, каковы основные ограничения видео-плеера, насколько я знаю, Direct3D имеет ограничения по размеру текстур (я не имею в виду размеры текстур с степенью двойки).

1 Ответ

0 голосов
/ 10 апреля 2010

Если вы хотите использовать программный рендер, сделайте ссылку на Mesa .

Вы можете получить оценку максимального размера текстуры, используя эти методы :

21.130 Каков максимальный размер текстурной карты, которую мое устройство будет отображать с аппаратным ускорением?

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

Вы можете получить оценку максимального размера текстуры, поддерживаемого вашей реализацией, с помощью следующего вызова:

GLint texSize;
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &texSize);

Если ваша текстура не аппаратно ускорена, но все еще находится в пределах ограничений размера, возвращаемых GL_MAX_TEXTURE_SIZE, она все равно должна отображаться правильно.

Это только оценка, потому что функция glGet*() не знает, какой формат, внутренний формат, тип и другие параметры вы будете использовать для любой данной текстуры. OpenGL 1.1 и выше решает эту проблему, разрешая прокси текстуры.

Вот пример использования текстуры прокси:

glTexImage2D(GL_PROXY_TEXTURE_2D, level, internalFormat, width, height, border, format, type, NULL);

Обратите внимание, что параметр пикселей равен NULL, поскольку OpenGL не загружает тексельные данные, когда целевой параметр равен GL_PROXY_TEXTURE_2D. Вместо этого OpenGL просто рассматривает, может ли он вместить текстуру указанного размера и описания. Если указанная текстура не может быть размещена, значения текстуры ширины и высоты будут установлены на ноль. После вызова прокси текстуры вы захотите запросить следующие значения:

GLint width;
glGetTexLevelParameteriv(GL_PROXY_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width);

if (width==0) {
   /* Can't use that texture */
}
...