Компьютерная графика

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Компьютерная графика » Программирование графики и GPU » Важно! Обсуждение статьи про отложенное освещение.


Важно! Обсуждение статьи про отложенное освещение.

Сообщений 31 страница 60 из 113

31

Исправил

0

32

Исправил это хорошо!

Но "располагая готовым G-буфером для вычисления освещения всех видимых фрагментов сцены нам достаточно просто вывести большой прямоугольник (quad). Вершинный шейдер при этом оказывается минимальным - передать ля итерполяции координаты. Основная работа осуществляется фрагментным шейдером, который по координатам источника света, положению освещаемой точки, соответствующей обрабатываемому фрагменту и нормали в этой точке, вычисляет освещенность с использованием заданной модели освещения." Может всё-таки "для"?

0

33

> передать ля итерполяции координаты
> Может всё-таки "для"?

strlen("располагая готовым <...> модели освещения.")=485;
1/485*100=0.2 %

разве стоит обращать внимание на такие мелочи? Тем более, это опечатка в описании а не в коде.

DungeonLords, Вы бы еще на форумах стали поправлять всякие "кроссавчеГ", "жжош" и "медвед"...

Отредактировано ASD (2009-05-26 22:00:48)

0

34

ASD написал(а):

разве стоит обращать внимание на такие мелочи? Тем более, это опечатка в описании а не в коде.
DungeonLords, Вы бы еще на форумах стали поправлять всякие "кроссавчеГ", "жжош" и "медвед"...

Ах ты медвед  :D . Вобщем это статья, а не коламбур! Вот и поправляю.

0

35

Такой вопрос.

Есть вершинный шейдер второго прохода:

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)

0

36

В вершинном шедйере
uniform vec3 pos;

Я не дельфист

+1

37

Steps3D написал(а):

В вершинном шедйере
uniform vec3 pos;

Ясно.

Но кто в статье будет это исправлять!?

0

38

Steps3D написал(а):

uniform vec3 pos;

Эээ, а может все таки varying. В юниформы вроде как не очень можно писать - они не изменятся все время выполнения шейдера...

0

39

Точно, описка - конечно же
varying vec3 pos;

Спасибо

0

40

В статье написано:
Основная работа осуществляется фрагментным шейдером, который по координатам источника света, положению освещаемой точки, соответствующей обрабатываемому фрагменту и нормали в этой точке, вычисляет освещенность с использованием заданной модели освещения.
Здесь преступная запятая! Убери срочно, а то предложение читаешь-читаешь, а что здесь написано непонятно.

Steps3D написал(а):

Точно, описка - конечно же
varying vec3 pos;

Тоесть что шейдер звучит так!!!:

varying vec3 pos;
void main(void)
{
    pos         = ( gl_ModelViewMatrix * gl_Vertex );
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
};

Я правильно написал!? И когда ж в статью будут внесены ПРАВКИ  :angry:  :angry:  :mad:

Видишь эту строчку из твоей статьи!:
#extension GL_ARB_texture_rectangle: enable
!!!  :mad:  Знаешь почему она у меня не работает !? :mad: !? Да потому что у меня драйвера на 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!!? Тогда зачем она нужна!!!!???  :mad:  :mad:  :mad:
Если она не нужна, зачем писать в вершинном шейдере такое:
//
// 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;

Но в них нужно передавать что-то?

Почему я вижу это на экране{текстуры (см. чуть выше) здесь не передовал} (демка своя, но делал всё по "описанным выше шейдерам"):
http://i028.radikal.ru/0905/2d/427c76aaf854.jpg

______________________________________________________________________________________________________________________________
Может я и слишком настойчив, но пока в GLScene (надстройка над OpenGL) не будет отложенного освещения, я от тебя не отстану!

И если будешь игнорировать части сообщения, буду пускать за тобой цитаты как хвосты.

Отредактировано DungeonLords (2011-01-06 04:47:09)

-1

41

DungeonLords написал(а):

!!!  :mad:  Знаешь почему она у меня не работает !? :mad: !? Да потому что у меня драйвера на OpenGL 3.0 и эта строчка вызывает ошибку! Там (в OpenGL 3.0) расширение инициализируется автоматом.

Большего бреда в жизни не слышал. Во первых, а вы инициализируете 3.0? Это, знаете ли, сильно отличается от 2.1...
Во вторых, строки включения расширений будут давать ошибки только в случае, если оно не поддерживается железом.
В третьих, функциональность предоставляемая 3.0 через расширения не инициализируется.

DungeonLords написал(а):

Если она не нужна, зачем писать в вершинном шейдере такое:

Документацию читать не пробовали?

DungeonLords написал(а):

Почему я вижу это на экране{текстуры (см. чуть выше) здесь не передовал} (демка своя, но делал всё по "описанным выше шейдерам"):

Ну нету второго прохода. Ну рисуется, судя по всему, текстура с позицией. Дык какого черта вы так и не осилили ПРОЧИТАТЬ статью внимательно не на предмет грамматических ошибок, а на предмет ее содержания?

DungeonLords написал(а):

И если будешь игнорировать части сообщения, буду пускать за тобой цитаты как хвосты.

На месте Алексея я бы дал вам бан по IP, e-mail и нику

Для начала выучите теор часть, а уж потом наезжайте на технические (и довольно грамотно написанные с технической точки зрения) статьи. И проявите, наконец, к их автору хоть чуть-чуть уважения.

0

42

DungeonLords

зачем так орать? Если так недовольны статьей, найдите другую.

> И если будешь игнорировать части сообщения, буду пускать за тобой цитаты как хвосты.

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

0

43

Извените пожалуйста, сорвался...  :'(

Вобщем пожалуйста посмотрите вот это: http://ifolder.ru/12479156
Это те злополучные шейдеры про которые я так кричал. Всё оформлено в формате rfx для RenderMonkey. Умоляю вас, посмотрите! Почему я вижу в общих чертах тоже, что и на скриншоте в моём сообщение выше? Пожалуйста, посмотрите...

P.S. Размер файла 4kb

Отредактировано DungeonLords (2009-06-04 23:54:22)

+1

44

Если попадалась другая статья, дайте пожалуйста ссылочку, а то нет пока.

Отредактировано DungeonLords (2010-02-26 17:33:40)

0

45

Чем именно они некорректны - у меня например все работает. Если несоответствует стандарту - то какому именно и в чем.
Пока все мои статьи ориентированы на OpenGL 2 - с ним вроде проблем нет

0

46

RenderMonkey не поддерживает MRT под OpenGL, насколько я помню. Так что результат, который вы видите - абсолютно корректый

0

47

Здравствуйте, у меня есть два вопросика по вашей статье...

1. Как сделать посветлее те участки, которые не попадают в зону источника света. Просто как-то уж слишком темно и мрачно.
2. Будете-ли вы расширять статью, по поводу теней в deffered shading, т.к. это ИМХО актуальная тема...

0

48

Добры день !

1. Можно просто ввести понятие фонового освещения, т.е. изначально считать, что каждый пиксел имеет некоторую освещенность, например 0.1
2. Наверное буду

0

49

Так вот я и ковыряю ex9-p2.fsh, добавил цвет источника, а вот с фоновым освещением проблема, не пойму куда его прописать...

0

50

Я думаю проще всего перед обработкой всех источников света вывести один scree-size quad с шейдером, дающим освещенность 0.1 всем пикселам

0

51

Хммм получается более светлая темнота).

Прикрепил картинки. Также код шейдеров

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)

0

52

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

0

53

А как мне стырить с экрана картинку непосредственно в шейдере(т.е. не передавать её через uniform sampler2D)?

0

54

А где ее "тырить" ?
Надо просто на этапе наложения освещения вывести полноэкранный прямоугольнк, с шейдером, в котором значение не вычисляется (как для настоящих объектов), а просто считается раным 0.1 (а бликовое 0)
Т.е. это просто наложение еще одного источника - глобального фонового освещения - единственное изменение в шейдере для наложения освещения - мы не считаем освещение (по векторам), а просто кладем его равным заданному знчению.
И тогда это фоновое освещение наложится на сцену точно так же как и от настоящих источников света

0

55

crsib написал(а):

RenderMonkey не поддерживает MRT под OpenGL, насколько я помню. Так что результат, который вы видите - абсолютно корректый

Э... Чушь! Я заменяю gl_FragColor на GL_FragDATA[0] и всё работает!

0

56

Cпешу вас огорчить, что на уровне шейдеров gl_FragData естественно корректно определен. Более того, при поддержке draw_buffers запись gl_FragData[0] эквивалентна gl_FragColor. А вот добать render target во framebuffer RenderMonkey вам не позволит.

Отредактировано crsib (2009-07-12 08:04:57)

+1

57

Т.е мне надо, один из источников посчитать "чуть" иначе(без учета attenuation и проч.), но как это реализовать в "софте" не понимаю(((, ибо в GLSL не силен.

Отредактировано BenTech (2009-07-13 21:40:06)

0

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)

0

59

Если нужно просто добавить фоновое освещение, то никакого distance attenuation нет, просто счиатем, что у всех пикселом есть диффузная освещенностьЮть и она постоянна

0

60

Ещё раз насчёт статьи. Я думаю, что не правильно говорить "Ниже приводятся вершинный и фрагментный шейдеры для записи в такой G-буфер...." При том, что в шейдере-то написано "gl_FragData [0] = vec4 ( pos, gl_FragDepth );gl_FragData [1] = vec4 ( 0.5*n2 + vec3(0.5), 1.0 );" т.е. получается, что строим мы два G буфера, раз рендинг идёт в две текстуры. Тобиш надо-бы писать "Ниже приводятся вершинный и фрагментный шейдеры для записи в такие G-буферы." Ну и такая же штука во всей статье сплош и рядом.

0


Вы здесь » Компьютерная графика » Программирование графики и GPU » Важно! Обсуждение статьи про отложенное освещение.


создать свой форум бесплатно