Исправил
Важно! Обсуждение статьи про отложенное освещение.
Сообщений 31 страница 60 из 113
Поделиться322009-05-26 12:25:40
Исправил это хорошо!
Но "располагая готовым G-буфером для вычисления освещения всех видимых фрагментов сцены нам достаточно просто вывести большой прямоугольник (quad). Вершинный шейдер при этом оказывается минимальным - передать ля итерполяции координаты. Основная работа осуществляется фрагментным шейдером, который по координатам источника света, положению освещаемой точки, соответствующей обрабатываемому фрагменту и нормали в этой точке, вычисляет освещенность с использованием заданной модели освещения." Может всё-таки "для"?
Поделиться332009-05-26 21:59:39
> передать ля итерполяции координаты
> Может всё-таки "для"?
strlen("располагая готовым <...> модели освещения.")=485;
1/485*100=0.2 %
разве стоит обращать внимание на такие мелочи? Тем более, это опечатка в описании а не в коде.
DungeonLords, Вы бы еще на форумах стали поправлять всякие "кроссавчеГ", "жжош" и "медвед"...
Отредактировано ASD (2009-05-26 22:00:48)
Поделиться342009-05-28 07:46:47
разве стоит обращать внимание на такие мелочи? Тем более, это опечатка в описании а не в коде.
DungeonLords, Вы бы еще на форумах стали поправлять всякие "кроссавчеГ", "жжош" и "медвед"...
Ах ты медвед . Вобщем это статья, а не коламбур! Вот и поправляю.
Поделиться352009-05-28 21:34:25
Такой вопрос.
Есть вершинный шейдер второго прохода:
void main(void)
{
pos = vec3 ( gl_ModelViewMatrix * gl_Vertex );
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
};
Но откуда здесь некий "pos"? Складывается ощущение, что всётаки надо так:
void main(void)
{ vec3 pos = ( gl_ModelViewMatrix * gl_Vertex );
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
};
Вобщем объясните что я не так делаю.
P.S. Если вы дельфист, то не забывайте, что я тоже (и отпишитесь с этим уклоном пожалуйста).
Отредактировано DungeonLords (2011-01-06 04:46:21)
Поделиться362009-05-28 22:57:32
В вершинном шедйере
uniform vec3 pos;
Я не дельфист
Поделиться372009-05-29 15:45:37
В вершинном шедйере
uniform vec3 pos;
Ясно.
Но кто в статье будет это исправлять!?
Поделиться382009-05-29 16:42:52
uniform vec3 pos;
Эээ, а может все таки varying. В юниформы вроде как не очень можно писать - они не изменятся все время выполнения шейдера...
Поделиться392009-05-29 19:09:43
Точно, описка - конечно же
varying vec3 pos;
Спасибо
Поделиться402009-05-30 00:55:43
В статье написано:
Основная работа осуществляется фрагментным шейдером, который по координатам источника света, положению освещаемой точки, соответствующей обрабатываемому фрагменту и нормали в этой точке, вычисляет освещенность с использованием заданной модели освещения.
Здесь преступная запятая! Убери срочно, а то предложение читаешь-читаешь, а что здесь написано непонятно.
Точно, описка - конечно же
varying vec3 pos;
Тоесть что шейдер звучит так!!!:varying vec3 pos;
void main(void)
{
pos = ( gl_ModelViewMatrix * gl_Vertex );
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
};
Я правильно написал!? И когда ж в статью будут внесены ПРАВКИ
Видишь эту строчку из твоей статьи!:
#extension GL_ARB_texture_rectangle: enable
!!! Знаешь почему она у меня не работает !? !? Да потому что у меня драйвера на OpenGL 3.0 и эта строчка вызывает ошибку! Там (в OpenGL 3.0) расширение инициализируется автоматом. Так что либо удали проблемную строку, либо подпиши, что мол вон "Если вы используете OpenGL версии 3.0 или выше, то строку "#extension GL_ARB_texture_rectangle: enable" нужно удалить из фрагментного шейдера второго прохода"
И какого хрена написано
//
// Fragment Shader for deferred shading pass 1
//
varying vec3 pos;
varying vec3 n;
uniform sampler2D diffMap;
void main (void)
{
vec3 n2 = normalize ( n );
gl_FragData [0] = vec4 ( pos, gl_FragDepth );
gl_FragData [1] = vec4 ( 0.5*n2 + vec3(0.5), 1.0 );
}
И при этом не используется diffMap!!? Тогда зачем она нужна!!!!???
Если она не нужна, зачем писать в вершинном шейдере такое:
//
// Vertex Shader for deferred shading pass 1
//
varying vec3 pos;
varying vec3 n;
void main(void)
{
pos = vec3 ( gl_ModelViewMatrix * gl_Vertex ); // transformed point to world space
n = normalize ( gl_NormalMatrix * gl_Normal ); // transformed n
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
gl_TexCoord [0] = gl_MultiTexCoord0;}
Скажи, вот есть
uniform sampler2DRect posMap;
uniform sampler2DRect normalMap;
Но в них нужно передавать что-то?
Почему я вижу это на экране{текстуры (см. чуть выше) здесь не передовал} (демка своя, но делал всё по "описанным выше шейдерам"):
______________________________________________________________________________________________________________________________
Может я и слишком настойчив, но пока в GLScene (надстройка над OpenGL) не будет отложенного освещения, я от тебя не отстану!
И если будешь игнорировать части сообщения, буду пускать за тобой цитаты как хвосты.
Отредактировано DungeonLords (2011-01-06 04:47:09)
Поделиться412009-05-30 23:58:40
!!! Знаешь почему она у меня не работает !? !? Да потому что у меня драйвера на OpenGL 3.0 и эта строчка вызывает ошибку! Там (в OpenGL 3.0) расширение инициализируется автоматом.
Большего бреда в жизни не слышал. Во первых, а вы инициализируете 3.0? Это, знаете ли, сильно отличается от 2.1...
Во вторых, строки включения расширений будут давать ошибки только в случае, если оно не поддерживается железом.
В третьих, функциональность предоставляемая 3.0 через расширения не инициализируется.
Если она не нужна, зачем писать в вершинном шейдере такое:
Документацию читать не пробовали?
Почему я вижу это на экране{текстуры (см. чуть выше) здесь не передовал} (демка своя, но делал всё по "описанным выше шейдерам"):
Ну нету второго прохода. Ну рисуется, судя по всему, текстура с позицией. Дык какого черта вы так и не осилили ПРОЧИТАТЬ статью внимательно не на предмет грамматических ошибок, а на предмет ее содержания?
И если будешь игнорировать части сообщения, буду пускать за тобой цитаты как хвосты.
На месте Алексея я бы дал вам бан по IP, e-mail и нику
Для начала выучите теор часть, а уж потом наезжайте на технические (и довольно грамотно написанные с технической точки зрения) статьи. И проявите, наконец, к их автору хоть чуть-чуть уважения.
Поделиться422009-06-02 18:37:42
DungeonLords
зачем так орать? Если так недовольны статьей, найдите другую.
> И если будешь игнорировать части сообщения, буду пускать за тобой цитаты как хвосты.
Автор Вам, кстати, не обязан ничем. Опять же, если так недовольны статьей, найдите другую.
Поделиться432009-06-04 23:53:53
Извените пожалуйста, сорвался...
Вобщем пожалуйста посмотрите вот это: http://ifolder.ru/12479156
Это те злополучные шейдеры про которые я так кричал. Всё оформлено в формате rfx для RenderMonkey. Умоляю вас, посмотрите! Почему я вижу в общих чертах тоже, что и на скриншоте в моём сообщение выше? Пожалуйста, посмотрите...
P.S. Размер файла 4kb
Отредактировано DungeonLords (2009-06-04 23:54:22)
Поделиться442009-06-11 08:43:50
Если попадалась другая статья, дайте пожалуйста ссылочку, а то нет пока.
Отредактировано DungeonLords (2010-02-26 17:33:40)
Поделиться452009-06-14 14:17:52
Чем именно они некорректны - у меня например все работает. Если несоответствует стандарту - то какому именно и в чем.
Пока все мои статьи ориентированы на OpenGL 2 - с ним вроде проблем нет
Поделиться462009-06-24 12:01:23
RenderMonkey не поддерживает MRT под OpenGL, насколько я помню. Так что результат, который вы видите - абсолютно корректый
Поделиться472009-07-07 14:59:47
Здравствуйте, у меня есть два вопросика по вашей статье...
1. Как сделать посветлее те участки, которые не попадают в зону источника света. Просто как-то уж слишком темно и мрачно.
2. Будете-ли вы расширять статью, по поводу теней в deffered shading, т.к. это ИМХО актуальная тема...
Поделиться482009-07-07 15:12:58
Добры день !
1. Можно просто ввести понятие фонового освещения, т.е. изначально считать, что каждый пиксел имеет некоторую освещенность, например 0.1
2. Наверное буду
Поделиться492009-07-07 16:22:22
Так вот я и ковыряю ex9-p2.fsh, добавил цвет источника, а вот с фоновым освещением проблема, не пойму куда его прописать...
Поделиться502009-07-07 17:07:06
Я думаю проще всего перед обработкой всех источников света вывести один scree-size quad с шейдером, дающим освещенность 0.1 всем пикселам
Поделиться512009-07-07 18:13:27
Хммм получается более светлая темнота).
Прикрепил картинки. Также код шейдеров
Vertex
void main(void)
{
gl_FragColor = vec4(0.5,0.5,0.5,1.0);
}
Fragment
void main(void)
{
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
P.S. что то делаю не так) наверное левые шейдеры, т.к. в них я не силен...
P.P.S а оно и должно так тормозить жутко???
Отредактировано BenTech (2009-07-07 18:14:34)
Поделиться522009-07-07 18:14:58
Нужно не доблять чистый серый, а умножить его на диффузный цвет, т.е. на первую картинку
Поделиться532009-07-07 18:27:04
А как мне стырить с экрана картинку непосредственно в шейдере(т.е. не передавать её через uniform sampler2D)?
Поделиться542009-07-08 11:08:43
А где ее "тырить" ?
Надо просто на этапе наложения освещения вывести полноэкранный прямоугольнк, с шейдером, в котором значение не вычисляется (как для настоящих объектов), а просто считается раным 0.1 (а бликовое 0)
Т.е. это просто наложение еще одного источника - глобального фонового освещения - единственное изменение в шейдере для наложения освещения - мы не считаем освещение (по векторам), а просто кладем его равным заданному знчению.
И тогда это фоновое освещение наложится на сцену точно так же как и от настоящих источников света
Поделиться552009-07-11 13:01:19
RenderMonkey не поддерживает MRT под OpenGL, насколько я помню. Так что результат, который вы видите - абсолютно корректый
Э... Чушь! Я заменяю gl_FragColor на GL_FragDATA[0] и всё работает!
Поделиться562009-07-12 01:10:18
Cпешу вас огорчить, что на уровне шейдеров gl_FragData естественно корректно определен. Более того, при поддержке draw_buffers запись gl_FragData[0] эквивалентна gl_FragColor. А вот добать render target во framebuffer RenderMonkey вам не позволит.
Отредактировано crsib (2009-07-12 08:04:57)
Поделиться572009-07-13 21:39:06
Т.е мне надо, один из источников посчитать "чуть" иначе(без учета attenuation и проч.), но как это реализовать в "софте" не понимаю(((, ибо в GLSL не силен.
Отредактировано BenTech (2009-07-13 21:40:06)
Поделиться582009-07-14 23:03:58
Мучал, мучал шейдер, вроде что-то получилось, но... не супер.
Вот немного "доработанный" мной фрагментный шейдер:
// // Deferred Shading pass 2, using only RGBA8 textures and depth map // #extension GL_ARB_texture_rectangle: enable varying vec3 pos; uniform vec3 lightPos; uniform vec3 Color; uniform sampler2DRect posMap; uniform sampler2DRect normalMap; uniform sampler2DRect colorMap; uniform int number; float MAX_DIST; float atten ( float d ) // compute distance attenuation factor, 0 -> 1, MAX_DIST -> 0 { const float offs0 = 1.0; const float offs1 = 1.0 / (1.0 + MAX_DIST); const float scale = 1.0 / (offs0 - offs1); return scale * ( 1.0 / (1.0 + d) - offs1 ); } // unpack a [0,1] value from a RGBA8 vec4 float unpackFloatFromVec4i ( const vec4 value ) { const vec4 bitSh = vec4 ( 1.0 / (256.0*256.0*256.0), 1.0 / (256.0*256.0), 1.0 / 256.0, 1.0 ); return dot ( value, bitSh ); } void main (void) { if(number==0) { MAX_DIST = 15000.0; } else { MAX_DIST = 8.0; } const float zFar = 1000.0; const float zNear = 0.01; vec4 zp = texture2DRect ( posMap, gl_FragCoord.xy ); float z = - zFar * unpackFloatFromVec4i ( zp ); vec3 n = 2.0*(texture2DRect ( normalMap, gl_FragCoord.xy ).xyz - vec3 ( 0.5) ); vec3 c = texture2DRect ( colorMap, gl_FragCoord.xy ).xyz; vec3 pp = pos * z / pos.z; vec3 ll = lightPos - pp; float d = length ( ll ); if ( d > MAX_DIST ) // too far away discard; float k = atten ( d ); vec3 l = ll / d; vec3 v = normalize ( -pp ); vec3 h = normalize ( l + v ); float diff = max ( 0.0, dot ( l, n ) ); float spec = pow ( max ( 0.0, dot ( h, n ) ), 40.0 ); //Color=clamp(Color,0.5,1.0); if(number == 0) { diff = clamp(diff,0.5,1.0); gl_FragColor = vec4 ( diff * c + vec3 ( spec ), 1.0 ) ; } else { gl_FragColor = k * vec4 ( diff * c * Color + vec3 ( spec ), 1.0 ); } }
(в доработанной мною области на лицо быдлокодинг))), как бы написать по красивше?)
На первой картинке результат с
diff = clamp(diff,0.0,1.0);
На второй
diff = clamp(diff,0.5,1.0);
Фигово выглядит в обоих случаях))).
Напрягают две вещи:
1.Размазанный в дали пол
2.Сопли от specular составляющей источника света(как я понял второе вытекает из первого).
Собственно как все это привести к божескому виду? Может нужно прикручивать tanget space?(т.к. bumpmapping).
//-------------------------------------------------------------------------------------------------------------Добавлено
Прикрутил анизотропную фильтрацию текстур (х16). Стало немного лучше(картинка 3), но всеравно что-то не так...
Отредактировано BenTech (2009-07-14 23:11:44)
Поделиться592009-07-15 11:41:44
Если нужно просто добавить фоновое освещение, то никакого distance attenuation нет, просто счиатем, что у всех пикселом есть диффузная освещенностьЮть и она постоянна
Поделиться602010-02-25 21:14:06
Ещё раз насчёт статьи. Я думаю, что не правильно говорить "Ниже приводятся вершинный и фрагментный шейдеры для записи в такой G-буфер...." При том, что в шейдере-то написано "gl_FragData [0] = vec4 ( pos, gl_FragDepth );gl_FragData [1] = vec4 ( 0.5*n2 + vec3(0.5), 1.0 );" т.е. получается, что строим мы два G буфера, раз рендинг идёт в две текстуры. Тобиш надо-бы писать "Ниже приводятся вершинный и фрагментный шейдеры для записи в такие G-буферы." Ну и такая же штука во всей статье сплош и рядом.