- Ошибка OpenGL 1281 invalid value в майнкрафт, как исправить, что делать?
- Как исправить ошибку:
- Как исправить ошибку Minecraft GLFW 65542 (драйвер не поддерживает OpenGL)?
- Способ 1: добавление OpenGL.DLL вручную
- Способ 2: удаление DisplayLink (если применимо)
- Способ 3: переустановка драйверов видеокарты
- [Гайд] Сжатый, но длинный туториал по openGL
- GloomyFolken
Ошибка OpenGL 1281 invalid value в майнкрафт, как исправить, что делать?
Сегодня случайно столкнулся с ошибкой OpenGL 1281 invalid value которая постоянно показывалась в чате игры, в этой статье я расскажу что можно сделать что бы исправить эту ошибку, а так же возможные причины ее появления.
На самом деле ошибка может быть такой OpenGL 1285 invalid value или даже другой, и причины у данной ошибки могут быть разные, лично я столкнулся с ошибкой при работе шейдеров и большинство игроков видят ошибку при попытке играть с шейдерами, тем не менее ошибка, видимо может вызываться и по другим причинам.
Как исправить ошибку:
- Первым делом обязательно обновите java и убедитесь что ваш лаунчер использует именно установленную вами версию. Некие лаунчеры умеют устанавливать джаву самостоятельно, но они устанавливают слишком старую версию. Если вы сами установили новую версию, лаунчер по прежнему будет использовать старую, необходимо в настройках указать путь до вашей новой версии.
Если вы играете с Optifine, то обновите его до последней версии. Аналогично, лаунчеры могут устанавливать старую версию.
Обновите драйвера вашей видеокарты.
Если вы играете с шейдерами и ошибка появляется при их работе, то вероятно, проблема в несовместимости данной версии шейдера и версии вашего Optifine, это может происходить когда вы запускаете очень старые версии шейдеров на самых новых версиях Minecraft и Optifine соответственно. В таком случае, можно поискать более новую версию шейдера, либо отключить отображение ошибки. (читай ниже) Удалить шейдер или установить другой шейдер
Как исправить ошибку Minecraft GLFW 65542 (драйвер не поддерживает OpenGL)?
Некоторые игроки Minecraft сталкиваются с ошибкой GLFW 65542 каждый раз, когда пытаются запустить игру. Эта проблема чаще всего возникает в Windows 10 с версией Minecraft на базе Java.
Большинство пользователей, которые боролись с этим кодом ошибки, смогли исправить ошибку GLFW 65542, скопировав отсутствующий файл opengl32.dll вручную в JRE (каталог Java). Если это не работает или вы хотите избежать каких-либо ручных изменений в каталоге JAVA, вы также можете переустановить каждый драйвер графического процессора, чтобы убедиться, что файл opengl32.dll будет переустановлен.
Однако, если вы столкнулись с этой проблемой в Java-версии Minecraft, эта проблема также может быть облегчена конфликтом с драйвером DisplayLink. В этом случае вы можете решить проблему, удалив конфликтующий драйвер и перезапустив игру.
Способ 1: добавление OpenGL.DLL вручную
Несмотря на то, что каждый требуемый файл библиотеки Dynamic Link обычно включен драйвером графического процессора, это не всегда так. Более того, вы, возможно, удалили opengl32.dll или opengl64.dll по ошибке, что в итоге вызовет ошибку GLFW 65542.
Если этот сценарий применим, одним из способов решения проблемы является ручное копирование отсутствующего файла .DLL в папку Java и JRE, чтобы позволить Minecraft использовать OpenGL. Это исправление было подтверждено многими пользователями, которые в настоящее время сталкиваются с ошибкой 65542 в Minecraft.
Чтобы добавить файл OpenGL.dll вручную в путь Java, следуйте приведенным ниже инструкциям:
- Откройте эту ссылку (Вот) и загрузите файл Minecraft_OpenGL.zip и дождитесь завершения загрузки. После завершения загрузки извлеките содержимое архива с помощью утилиты, например 7zip или WinZip,
- После извлечения содержимого этой утилиты скопируйте файл, совместимый с вашей архитектурой ОС, в буфер обмена, щелкнув по нему правой кнопкой мыши и выбрав «Копировать» или «Вырезать».
Скопируйте файл OpenGL в буфер обменаПримечание. Если вы не знаете, какую архитектуру ОС вы используете, щелкните правой кнопкой мыши «Мой компьютер» («Этот компьютер») и выберите «Свойства» в контекстном меню. На экране «Свойства» проверьте список в разделе «Тип системы» – это ваша архитектура ОС.
Проверка архитектуры вашей ОС
Если та же проблема все еще возникает, перейдите к следующему потенциальному решению ниже.
Способ 2: удаление DisplayLink (если применимо)
Если вы активно используете драйвер DisplayLink, имейте в виду, что эта технология может конфликтовать с версией Minecraft на Java. Некоторые пользователи, с которыми мы сталкиваемся с ошибкой GLFW Error 65542 всякий раз, когда они пытались запустить Minecraft, подтвердили, что его проблема исчезла навсегда, как только они закончили удаление графического программного обеспечения USB DisplayLink.
Если этот сценарий применим к вам, следуйте приведенным ниже инструкциям, чтобы удалить программное обеспечение DisplayLink USB Graphics с вашего компьютера, чтобы устранить конфликт с Minecraft:
- Нажмите клавишу Windows + R, чтобы открыть диалоговое окно «Выполнить». Затем введите «appwiz.cpl» и нажмите Enter, чтобы открыть меню «Программы и компоненты».
Введите appwiz.cpl и нажмите Enter, чтобы открыть список установленных программ.
- Как только вы окажетесь в меню «Программы и файлы», прокрутите список установленных приложений и найдите запись с именем «Графический драйвер DisplayLink».
- Когда вам удастся найти его, щелкните его правой кнопкой мыши и выберите «Удалить» из контекстного меню, чтобы начать процесс удаления.
Удаление драйвера DisplayLink Graphics
- При появлении запроса на подтверждение нажмите Да, затем следуйте инструкциям на экране для завершения процесса удаления.
- После завершения операции перезагрузите компьютер и снова запустите Minecraft после завершения следующего запуска, чтобы увидеть, был ли устранен конфликт.
Если этот сценарий неприменим или вы уже выполнили его безуспешно, перейдите к следующему потенциальному исправлению ниже.
Способ 3: переустановка драйверов видеокарты
Как выясняется, вы также столкнетесь с ошибкой GLFW Error 65542, если используете набор устаревших графических драйверов, которые не знают, как работать с версией OpenGL, которую использует Minecraft. Однако, если у вас недавно были проблемы с вредоносными программами, эта проблема также может быть связана с проверкой безопасности, если операция в результате изолировала некоторые файлы, необходимые для запуска OpenGL.
Если вы не обновляли драйверы GPU в течение некоторого времени, вероятно, вы сможете исправить проблему, используя Диспетчер устройств и Программы и компоненты, чтобы удалить все, что связано с вашим GPU, а затем переустановить их с официальных каналов.
Если вы не совсем уверены, как это сделать, следуйте приведенным ниже инструкциям:
- Нажмите клавишу Windows + R, чтобы открыть диалоговое окно «Выполнить». Затем введите «devmgmt.msc» и нажмите Enter, чтобы открыть диспетчер устройств. Если вас попросит UAC, нажмите Да, чтобы предоставить доступ администратора.
Запуск диспетчера устройств
- Как только вы окажетесь в диспетчере устройств, раскройте раскрывающееся меню, связанное с адаптерами дисплея, а затем продолжите и удалите все графические драйверы, щелкнув по ним правой кнопкой мыши и выбрав «Удалить». Делайте это для каждой записи в адаптерах устройств. Если у вас есть как встроенный, так и выделенный графический процессор, удалите оба типа драйверов.
Удалите каждый драйвер графического процессораПримечание. Экран может мерцать после удаления. Это происходит потому, что ваша ОС вернется к универсальным драйверам.
- После удаления каждого драйвера графического процессора из диспетчера устройств закройте утилиту диспетчера устройств.
- Нажмите клавишу Windows + R еще раз, чтобы открыть другое диалоговое окно «Выполнить». Затем введите «appwiz.cpl» и нажмите Enter, чтобы открыть экран «Программы и компоненты».
Введите appwiz.cpl и нажмите Enter, чтобы открыть список установленных программ.
- Как только вы окажетесь в меню «Программы и компоненты», прокрутите список установленных приложений и начните удаление всего, что связано с вашим производителем графических процессоров (Nvidia AMD или Intel). Вы можете убедиться, что ничего не оставили, щелкнув столбец «Издатель», чтобы упорядочить их один за другим. Просто щелкните правой кнопкой мыши по каждому инструменту или драйверу, связанному с графическим процессором, и выберите «Удалить» из контекстного меню.
Удалите все программы, связанные с GPU
- На экране удаления следуйте инструкциям на экране для завершения процесса. После удаления всех соответствующих драйверов перезагрузите компьютер и дождитесь завершения следующего запуска.
- После завершения следующего запуска посетите страницу загрузки, связанную с вашим производителем графического процессора, и загрузите последнюю версию драйвера, доступную для вашей конкретной модели графического процессора:
Страница загрузки Nvidia
Страница загрузки AMD
Страница загрузки графики Intel - Загрузите и установите рекомендуемые драйверы в зависимости от модели вашей видеокарты, затем перезагрузите компьютер и запустите Minecraft после завершения следующего запуска, чтобы увидеть, устранена ли проблема.
[Гайд] Сжатый, но длинный туториал по openGL
GloomyFolken
[h]Предисловие[/h]
Здесь я постарался как можно более емко и кратко рассказать о тех возможностях openGL, которые могут пригодиться при создании модов для Minecraft. Несмотря на это, объем текста получился весьма внушительным.
Для того, чтобы по-настоящему владеть openGL, этого туториала вам все равно не хватит. Нужно будет прочитать раз в 10 больше литературы. Кроме того, нужны базовые, но уверенные познания в математике и достаточное количество терпения, чтобы понять суть матриц трансформации.
Туториал носит по большей части теоретический характер, реальных примеров в нем очень мало. Он призван немного сбалансировать огромное количество туториалов, в которых используется openGL-код без толкового объяснения происходящего.
Описываются по большей части возможности openGL 1, на котором построен Minecraft. Да, я в курсе, что он давным-давно устарел, но в процессе модификации Minecraft’а избежать использования openGL 1 всё равно не выйдет. Про новые возможности будет сказано немного и в самом конце.
[h]Небольшое FAQ по определениям[/h]
q: Что такое openGL?
a: OpenGL — это API, предоставляющий программистам доступ к возможностям видеокарты. В случае c Minecraft’ом, этот API реализует библиотека LWJGL.
q: Что делают функции openGL?
a: Функции openGL делятся на два типа: одни меняют его глобальное состояние (openGL state), в то время как другие передают в него данные (позиции вершин, UV-координаты и нормали) для отрисовки.
q: Что такое глобальное состояние openGL?
a: Состояние openGL — это набор глобальных параметров, в зависимости от которого один и тот же набор вершин отрисовывается по-разному. Описание отдельных элементов состояния openGL будет ниже.
q: В чем суть того, что делает openGL?
a: OpenGL строит изображение на экране (или в памяти) на основе поступающих в него вершин (координат) и своего состояния. В зависимости от состояния он может рисовать точки, линии и многоугольники.
q: Что такое UV-координаты?
a: UV-координаты — пары вещественных чисел от 0 до 1, соответствующие некоторым координатам на текстуре. U — горизонтальная координата, V — вертикальная. Если при рендеринге используется текстура, то, передавая вершину на отрисовку, необходимо указать еще и ее UV-координаты.
q: Что такое нормали?
a: Нормали — вектора, перпендикулярные поверхности. Они нужны для рассчета освещения. Нормалью к вершине может быть как перпендикуляр к полигону, к которому она принадлежит, так и средний вектор между перпендикулярами к нескольким полигонам, если вершина принадлежит к нескольким полигонам одновременно. Нормали должны быть нормализованы (то есть иметь единичную длину).
Подсказка: можно прописать в импортах import static org.lwjgl.opengl.GL11.* (и другие нужные версии) и не заморачиваться с постоянным повторением GL11.
[h]Немного практики[/h]
Наша пробная задача — отрендерить tile entity в виде квадрата. Будем считать, что вы уже умеете создавать блок с моделью . Код ниже должен быть в методе renderTileEntityAt(x, y, z, f, partialTickTime) нашего TileEntitySpecialRenderer.
Используя только openGL:
Этой возможностью стоит пользоваться, потому что вызывать каждый раз функции openGL — очень и очень медленно, а здесь применены некоторые оптимизации. Если наложена текстура, то вместо addVertex() нужно использовать addVertexWithUV(), а если включено освещение, то перед добавлением вершин, принадлежащих новому полигону, нужно применять setNormal().
Если с добавлением вершин все должно быть более-менее понятно, то остальное — понятно не всем. В openGL есть такое понятие, как «матрицы трансформации». Я вряд ли опишу лучше, чем здесь, но всё же попробую вкратце пересказать, а также немного дополнить.
[h]Матрицы трансформации[/h]
Матрица трансформации в openGL — это двумерный массив чисел 4х4. По сути матрицы в комьютерной графике используется для того, чтобы перейти от одной системы координат (иногда используется слово «пространство» или «space») к другой. Я не буду здесь подробно описывать арифметику матриц, потому что это займет кучу места и не очень нужно в целом, но для глубокого понимания лучше все-таки прочитать про неё отдельно.
Чаще всего применяется две операции. Их суть вы поймете чуть позже.
1) Умножение вектора на матрицу. Как результат этой операции мы получаем вектор в другой системе координат.
2) Умножение матриц. Как результат мы получаем новую матрицу, которая трансформирует вектора так же, как если бы мы умножили сначала на одну матрицу, а потом на другую.
При умножении матриц (как и при умножении вектора на две матрицы последовательно) важен порядок действий. Это легко понять, если представить две последовательности действий:
1) Пройти десять метров вперед, повернуть на 90 градусов вправо, пройти пять метров вперед.
2) Повернуть на 90 градусов вправо, пройти десять метров вперед, пройти пять метров вперед.
Очевидно, что в результате мы окажемся на разных координатах. Так же и с матрицами.
Основных систем координат (и, соответственно, матриц) три — MODEL (для перехода из пространства текущего объекта в мировое), VIEW или CAMERA (для перехода из мирового пространства в пространство камеры) и PROJECTION (для проекции сцены на 2d изображение).
По поводу MODEL и VIEW матриц стоит сделать два замечания. Во-первых, в openGL эти матрицы объединены в одну, которая называется MODELVIEW. Во-вторых, из-за огромных размеров мира в Minecraft’e пришлось отказаться от использования мирового пространства вообще.
При построении матрицы MODELVIEW для отрисовки блока с моделью выполняется последовательность действий (упрощённо):
1) Если включен вид от третьего лица, сместить на несколько метров вперед или назад
2) Если включен вид спереди, повернуть на 180 градусов вокруг оси Y
3) Повернуть камеру в соответствии со взглядом игрока
4) Сместиться на разность координат между позицией блока и камеры. Именно эта разность передается как x, y и z в метод renderTileEntityAt().
Первые три действия делает Minecraft, четвертое нужно делать самому. При умножении координат какой-либо вершины в пространстве модели на матрицу MODELVIEW эти операции будут применены в обратном порядке и мы перейдем в пространство камеры. Непосредственно перед отрисовкой модели можно применить и другие операции с матрицей MODELVIEW, такие как масштабирование или поворот.
Я почти уверен, что из моего посредственного объяснения вы вынесли очень немногое, и настоятельно рекомендую сейчас перейти по этой ссылке и прочитать ВСЮ статью. Три раза.
[h]Функции openGL, связанные с матрицами[/h]
Систему координат мы можем сдвигать, поворачивать и масштабировать. Для этого используются функции glTranslate*(x, y, z), glRotate*(angle, x, y, z) и glScale*(x, y, z). Вместо * в названии функции используется «f» или «d» в зависимости от того, какой тип данных она принимает в качестве аргументов — float или double. В glRotate аргумент angle — это угол в градусах (положительный угол = поворот против часовой стрелки), а x, y и z — вектор, вокруг которого поворачивать. Например, glRotatef(-90, 0, 1, 0) — повернуть на 90 градусов по часовой стрелке вокруг вертикальной оси.
Часто необходимо сохранить текущую матрицу с возможностью последующего восстановления. Это возможно при помощи функций glPushMatrix() и glPopMatrix(). glPushMatrix() добавляет матрицу в стек (список) сохраненных матриц. glPopMatrix() восстанавливает последнюю матрицу из стека и удаляет ее оттуда. Например:
Функция glLoadIdentity() задает единичную матрицу (которая не делает никаких трансформаций). На практике при создании модов она вряд ли понадобится.
[h]Другие параметры openGL[/h]
Кроме матриц трансформации, есть огромное количество других составляющих состояния openGL. Я попробую рассказать о тех, что наиболее важны при создании модов.
В openGL есть несколько boolean-параметров, которые включаются и отключаются при помощи функций glEnable() и glDisable(), куда в качестве аргумента передается опкод этого параметра. С некоторыми из этих параметров связаны другие функции.
GL_DEPTH_TEST включает тест глубины. В большинстве случаев он включен и нужен. Его задача — отсекать те полигоны, которые заслонены другими, даже если «дальний» полигон рисуется после «ближнего». При отрисовке кадра кроме того изображения, что позже будет выведено на экран, есть еще один буфер, который называется буфер глубины, depth buffer или z-буфер. При отрисовке пикселя в этот буфер добавляется информация о том, как далеко он расположен от камеры. Подробнее можно прочитать здесь, и я очень советую это сделать.
Сопутствующие функции:
glDepthMask(true/false) — включает/выключает запись в этот буфер. Если тест глубины выключен, то никакого влияния этот параметр не оказывает, в буфер глубины все равно ничего не будет записываться. Единственная функция в этом списке, которая часто нужна в моддинге.
glClearDepth(value) — очищает буфер глубины и заполняет его указанным числом. 1.0 — «пустой» буфер.
glDepthFunc(func) — устанавливает функцию, по которой проверяется, нужно ли отрисовывать пиксель или он чем-то заслонен. GL_LEQUAL используется в майне по умолчанию, это «меньше или равно» (less or equal). Насколько оправдано использовать другие функции — затрудняюсь ответить.
glDepthRange(zNear, zFar) — устанавливает «ближнюю» и «дальнюю» глубину в буфере. 0.0 соответствует ближней глубине, 1.0 — дальней.
GL_BLEND включает полупрозрачность (смешивание цветов). С ней есть две проблемы. Во-первых, эта опция серьезно снижает производительность, и включать ее для всего не стоит. Во-вторых, она плохо сочетается с буфером глубины. При использовании буфера глубины абсолютно безразлично, в каком порядке отрисовывать полигоны, но для корректного смешивания их нужно сортировать от дальнего к ближнему. Обычный путь — это отрисовать сначала всю непрозрачную геометрию со включенными GL_DEPTH_TEST и glDepthMask, потом выключить glDepthMask и отрисовать полупрозрачную геометрию, немножко сортируя ее по ходу дела . В Minecraft’e используется этот подход. Реализуется это через фичу, которая называется render pass. Нулевой pass — это непрозрачная геометрия, первый — полупрозрачная. Например, у сущностей есть метод shouldRenderInPass(). Получить текущий render pass можно через MinecraftForgeClient.getRenderPass().
Сопутствующая функция:
glBlendFunc(sfactor, dfactor) — параметры, по которым считается итоговый цвет пикселя.
finalColor = sfactor * srcColor + dfactor * destColor, где srcColor — цвет рисуемого полигона (например, с текстуры), а destColor — цвет того, что уже нарисовано на месте этого пикселя. Обычные применения:
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) — «нормальное» смешивание.
glBlendFunc(GL_ONE, GL_ONE) — аддиктивное смешивание, то есть сложение нового и старого цвета. Полезно для «энергетических» эффектов вроде огня и электричества.
glBlendFunc(GL_SRC_ALPHA, GL_ONE) — то же самое, но с учетом прозрачности с текстуры.
GL_TEXTURE_2D включает использование текстуры. В качестве «сопутствующей» функции можно было бы указать Minecraft.getMinecraft().renderEngine.bindTexture().
GL_LIGHTING включает простое освещение (с двумя источниками света на постоянных позициях). Оно НИКАК не связано с тем, как затеняются блоки ночью и в тени. Про освещение в Minecraft расскажу внизу.
Когда GL_LIGHTING нужно:
1) При рендеринге сущностей
2) При рендеринге tile entity
3) При рендеринге блоков в GUI
4) При рендеринге предмета в руках
Когда оно не нужно:
1) При рендеринге обычных блоков в мире. Там всё работает на костылях.
2) При рендеринге частиц
3) При рендеринге GUI
Сопутствующих фунций и параметров много, а рассказывать о них в контексте Minecraft’a толку мало. Включается дефолтное освещение через RenderHelper.enableStandardItemLighting(), выключается через RenderHelper.disableStandardItemLighting(), вспомогательные функции там и смотрите.
GL_ALPHA_TEST включает запрет на отрисовку пикселей в зависимости от значения alpha (непрозрачности). Обычное использование — запрет на отрисовку полностью прозрачных пикселей, потому что иначе при выключенном смешивании они будут рисоваться. Например, нарисовав квадрат с текстурой круга (на текстуре всё за пределами круга полностью прозрачно), вы всё равно получите квадрат. С этим же параметром связана ситуация, когда при включенном смешивании почти прозрачные пиксели вообще не видны. Тогда нужно отключить альфа-тест.
Сопутствующая функция:
glAlphaFunc(func, ref) — задает параметры альфа-теста. Первое значение — функция сравнения, второе — число, с которым сравнивать. Обычное использование — что-нибудь вроде glAlphaFunc(GL_GREATER, 0.1F).
GL_CULL_FACE включает запрет на отрисовку полигонов с обратной стороны. По умолчанию включен, имеет смысл выключать в случаях, когда иначе придется дублировать полигоны с обеих сторон. Сопутствующие функции указывают, что считать передней и обратной сторонами полигона и какие стороны обрезать при включенном GL_CULL_FACE. Никакого смысла трогать эти функции нет, по умолчанию передней стороной считается та, которая рисуется против часовой стрелки.
GL_NORMALIZE включает автоматическую нормализацию нормалей. Довольно затратно, на практике использовать не стоит.
GL_RESCALE_NORMAL — упрощенный и ускоренный вариант GL_NORMALIZE. Он подразумевает, что переданные в openGL нормали уже были нормализованы, но вы масшабировали матрицу трансформации (использовали glScale()). Работает верно только в тех случаях, когда матрица была масштабирована без искажений, то есть x, y и z, которые вы передали в glScale(), были равны.
GL_POLYGON_OFFSET_FILL включает смещение данных из буфера глубины при отрисовке. Звучит немного непонятно, зато решает гораздо более понятную проблему. Если попробовать отрендерить что-то поверх уже отрисованной поверхности (пример из ванильного майна — текстура разрушения блока поверх самого блока), то начнутся проблемы, связанные с точностью буфера глубины. Подробнее про них можно почитать по ссылке про этот буфер, которую я уже давал.
Сопутствующая функция:
glPolygonOffset(factor, units) — задает смещение. Обычное использование в майне — glPolygonOffset(-3.0F, -3.0F). Кроме того, перед рендерингом с использованием этой возможности обычно отключают glDepthMask().
GL_SCISSOR_TEST запрещает отрисовку за пределами указанной квадратной зоны на экране. Естественно, основное применение этой фичи — GUI (например, довольно сложно реализовать скроллящуюся панель без этой возможности).
Сопутствующая функция:
glScissor(x, y, width, height). Координаты и размеры указываются в пикселях в окне, а не в том, что называется «пикселями» в ГУИ и на практике обычно оказывается больше реальных пикселей. Кроме того, ось Y идет снизу, а не сверху. Пример использования (запретить отрисовку за пределами квадрата 100х100 в верхнем левом углу экрана):
glScissor(0, mc.diplayHeight — 100, 100, 100);
glColor4f() и tessellator.setColorRGBA_F() — задает RGBA цвет. Аргументы должны быть от 0 до 1. Со включенной текстурой тоже работает, в таком случае цвет текстуры домножается на указанный здесь цвет.
glShadeModel(GL_FLAT/GL_SMOOTH) задает простое или сглаженное освещение. GL_FLAT стоит использовать, если в качестве нормалей вы используете перпендикуляр к полигону, GL_SMOOTH — если средний вектор между перпенндикулярами к нескольким полигонам.
Я рассказал только о тех функциях и параметрах, которые кажутся мне наиболее важными для моддинга. Это где-то треть от всех возможностей даже openGL 1, не говоря о современных версиях. Если этого вам недостаточно, то ваш лучший друг — это официальная документация по openGL.
Далее о некоторых вещах, которым не место в гайде по openGL 1, но о которых стоило бы рассказать.
[h]Освещение в Minecraft[/h]
В Minecraft есть два типа освещения: от блоков и от неба. У каждого блока в игре есть два параметра от 0 до 15: освещенность от неба и от блоков-источников света. С каждым пройденным от источника света блоком освещенность падает на 1. Освещенность от неба под открытым небом равна 15 даже глубокой ночью.
Теперь о том, как же всё это отрисовывается.
Есть динамическая текстура 16х16 (mc.renderEngine.lightmapTexture) и соответствующий ей массив размером 256 int’ов (mc.renderEngine.lightmapColors). В ней хранится информация о том, какой цвет соответствует каждой комбинации освещения от неба и освещения от блоков. Каждый кадр эта динамическая текстура обновляется исходя из текущего времени суток, рандомной «мигалки» (освещение от блоков немного колеблется), настроек игры (гаммы) и наложенного ночного зрения. Некоторые объекты (например, сущности и tile entity) рендерятся в режиме мультитекстурирования: в первой текстуре забиндена обычная текстура этого объекта, а во второй — лайтмапа. UV-координаты на лайтмапе задаются через OpenGLHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, u, v). Для сущностей и тайлов эта операция производится перед рендерингом.
Отключить использование лайтмапы можно через mc.renderEngine.disableLightmap(), включить — через mc.renderEngine.enableLightmap().
[h]Введение в шейдеры[/h] (а не рассказ о том, как их использовать)
В openGL 1 вы не можете написать ни строчки кода, которая исполнялась бы на видеокарте. Всё, что вам доступно — это стандартные возможности openGL. В openGL 2.0 такая возможность появилась. Хотя официально Minecraft поддерживает все версии openGL, начиная с 1.2, использовать возможности openGL 2.0 можно относительно безбоязненно, потому что видеокарты без его поддержки уже настолько устарели, что Minecraft на них вряд ли запустится.
Шейдеры — это короткие программы на простом си-подобном языке, позво В openGL 2.0 доступно два типа шейдеров: вершинные и фрагментные (пиксельные). Вершинные шейдеры позволяют модифицировать координаты вершин и передавать данные во фрагментные шейдеры. Фрагментные шейдеры позволяют модифицировать цвет вершины на основе данных, полученных из вершинного шейдера и текстур.
С помощью шейдеров можно эффективнее использовать видеокарту для различных вычислений. Примеры использования шейдеров: симуляция воды, реалистичное освещение (с тенями), использование различных карт (normal map для рельефа, specular map для бликов, gloss map для «шероховатости» и другое), создание различных графических эффектов, пост-обработка кадра и другое. Про использование шейдеров можно написать намного больше, чем всё то, что я написал в этом гайде.