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