LWJGL 2d Lighting (Java)

Я и моя команда только что перенесли нашу игру с java2d на LWJGL и хотим добавить освещение. Что именно мы хотим добавить:

  • предметы / объекты, которые излучают свет и являются подвижными.
  • Статическое освещение

Мы уже давно гуглили, но потерялись, потому что понятия не имеем, с чего начать. Мы видели метод альфа-картографирования, но не смогли заставить его работать.

Я был бы рад, если бы кто-то мог дать мне ответ.

Спасибо!

1 ответ

Решение

Создать свет, наверное, проще, чем можно подумать! Следующий код создаст источник света и включит освещение, хотя можно использовать разные параметры, а также изменять и использовать такие вещи, как GL_SPECULAR, так далее.

FloatBuffer ambient = BufferUtils.createFloatBuffer(4);
ambient.put(new float[] { 0.05f, 0.05f, 0.05f, 1f, });
ambient.flip();    

FloatBuffer position = BufferUtils.createFloatBuffer(4);
position.put(new float[] { 0f, 0f, 0f, 1f, });
position.flip();    

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glLightModel(GL_LIGHT_MODEL_AMBIENT, ambient);
glLight(GL_LIGHT0, GL_POSITION, position);

Помните, что вам нужно использовать и вычислять нормали, потому что свет рассчитывается по ним.

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

glEnable(GL_COLOR_MATERIAL);

Кроме того, если есть какая-то часть, на которую вы не хотите воздействовать, например, на освещение, то перед рендерингом вызываемого вами интерфейса glDisable(GL_LIGHTING); а потом звонишь glEnable(GL_LIGHTING); снова после того, как пользовательский интерфейс, если вы хотите, чтобы освещение было включено впоследствии.

Помните

Если вы не импортируете классы статически, просто уведомите вас, что glEnable(GL_LIGHTING); было бы GL11.glEnable(GL11.GL_LIGHTING); как и все остальное, что я только что показал вам.

Также имейте в виду, что OpenGL содержит только 0 источников света от GL_LIGHT0 в GL_LIGHT7Хотя больше света можно легко создать разными способами.

Важно, если вы думаете, что использование источников света OpenGL будет генерировать тени, тогда этот код разочарует вас, создание теней - это комбинация источников света OpenGL и некоторой продвинутой работы FBO, если я правильно помню.

дополнительный

Если вы хотите подвижное освещение, вам просто нужно обновить glLight(GL_LIGHT0, GL_POSITION, position); каждый раз, когда вы двигаете свет.

Вот небольшое учебное пособие по типам освещения, которое я нашел, просто выполнив поиск по "освещению opengl", хотя учебное пособие написано на C++, но функции OpenGL практически одинаковы, независимо от того, какой язык вы используете, только небольшие изменения, которые легко найти и изменить. http://www.swiftless.com/tutorials/opengl/lighting_types.html

Другие вопросы по тегам