- 1,870
- 52
- 357
Всем привет.
Захотел я тут добавить некоторые спецэффекты предмету(в руке от первого лица), но для их обработки необходима шейдерная программа.
Все бы ничего, да только если использовать шейдер, а не стандартный конвейер Fixed Function Pipeline, освещение очевидно нужно каким-то образом накладывать вручную.
Немного поискав, я пришел к выводу, что наложение текстурки лайтмапы не решит данную проблему:
Днем мой предмет все равно темный, как ночью. Но если подойти к источнику света - все становится нормально.
Это наверное потому что текстурная координата лайтмапы v в любое время суток под открытом небом равна 240.
А если зайти куда-нибудь под навес, то все опять становится нормально.
Как исправить, думаю банальным домножением итогого цвета на временя суток дело не решится?
Мне кажется ответ тут более глобальный - каким-нибудь образом надо перенести стандартный пайплайн обработки в шейдер(хотя бы небольшую часть с освещением).
Ибо помимо лайтмапы в майнкрафте(как оказывается??) есть еще диффузное освещение, благодаря которому мы можем видеть темные области со стороны, обратной источнику света(по крайней мере так должно быть):
Само по себе такое довольно примитивное на первый взгляд освещение можно написать без особых усилий.
Но что использовать на источники света? близлежайшие блоки света? или можно обойтись встроенными glsl'овскими переменными?
Захотел я тут добавить некоторые спецэффекты предмету(в руке от первого лица), но для их обработки необходима шейдерная программа.
Все бы ничего, да только если использовать шейдер, а не стандартный конвейер Fixed Function Pipeline, освещение очевидно нужно каким-то образом накладывать вручную.
Немного поискав, я пришел к выводу, что наложение текстурки лайтмапы не решит данную проблему:
Код:
#version 120
//...
in vec2 texCoord;
in vec2 lightMapTextureCoords;
uniform sampler2D originalTexture;
uniform sampler2D lightmap;
void main(void) {
//...
vec4 lightMap = texture2D(lightmap, lightMapTextureCoords / 240.0);
gl_FragColor = objectTexture * lightMap;
}
Код:
#version 120
//...
varying vec2 texCoord;
varying vec2 lightMapTextureCoords;
void main(){
gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex;
texCoord = vec2(gl_MultiTexCoord0);
lightMapTextureCoords = vec2(gl_MultiTexCoord1);//получаем uv из текстурного юнита 1(юнит лайтмапы)
}
Это наверное потому что текстурная координата лайтмапы v в любое время суток под открытом небом равна 240.
А если зайти куда-нибудь под навес, то все опять становится нормально.
Как исправить, думаю банальным домножением итогого цвета на временя суток дело не решится?
Мне кажется ответ тут более глобальный - каким-нибудь образом надо перенести стандартный пайплайн обработки в шейдер(хотя бы небольшую часть с освещением).
Ибо помимо лайтмапы в майнкрафте(как оказывается??) есть еще диффузное освещение, благодаря которому мы можем видеть темные области со стороны, обратной источнику света(по крайней мере так должно быть):
Само по себе такое довольно примитивное на первый взгляд освещение можно написать без особых усилий.
Но что использовать на источники света? близлежайшие блоки света? или можно обойтись встроенными glsl'овскими переменными?
gl_FrontLightModelProduct
, gl_LightModel
и gl_LightSource
возвращают вообще непонятно что, видать это фейковое освещение блоках в иконках слотов