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

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

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


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


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

Сообщений 61 страница 90 из 113

61

Сори за двойной пост, навеяло. "Основная идея этого подхода заключается в том, что сначала по всей сцене строится так называемый G-буфер (geometry buffer), для каждого пиксела сцены содержащий всю информацию, необходимую для определения его освещенности и итогового цвета." Здесь пропущена запятая перед причастным оборотом: Основная идея этого подхода заключается в том, что сначала по всей сцене строится так называемый G-буфер (geometry buffer) для каждого пиксела сцены, содержащий всю информацию, необходимую для определения его освещенности и итогового цвета. И плюс стоит лишняя запятая после скобки.

И мне весьма интересно: вот если GPU серии GeForce 6XXX (древность такая...) могут рендить в 4 текстуры, то разве не глупо рендить всего в две? И ещё, вот вы пишите: "Рассмотрим сначала самый простой случай - будем осуществлять рендеринг всего в две текстуры...",- что по мне, так было бы круто, если бы вы рассмотрели рендинг в одну текстуру для начала. Вот это было бы просто превосходно!

+ И на последок. В исходнике, в ds-1.cpp, используется "createTexture2D" - какая-то функция. Не подскажите, где её тело?

Отредактировано DungeonLords (2010-02-27 14:45:02)

0

62

Запятую поправлю, спасибо
Насчет числа текстур - чем в большее число тектсур идет рендеринг тем больше объем данных - один из минусов DS именно в этом - нужно записать очень много данных и наступаем на скорость работы с памятью.
А в одну никак не получится - всегда нужен цвет и нормаль, т.е. уже получается две текстуры
Функция createTexture2D из моей библиотеки (http://steps3d.narod.ru/downloads/libTexture.zip) - лучше тогда сразу скачать готовый фреймворк StepsFramework - на сайте есть линк на последнюю версию.

0

63

Ну и, Steps3D, выкиньте вы уже "uniform sampler2D  diffMap;" из первой шейдерной программы, он там не используется.

И такой вопросик. Скачал "исходники", но почему в Visual пункт "Зпуск без отладки" неактивен. В C++ не силён.

Отредактировано DungeonLords (2010-02-27 14:47:33)

0

64

И ещё, вот это предложение построено не по-русски: "Light Indexed Deferred Rendering основан на другой идее - обычно, когда у нас очень много источников света, то каждому фрагменту соответствует всего несколько источников света. Поэтому данный подход в G-буфере для каждого фрагмента хранит (он не может "хранить") специально запакованный список источников света, освещающих данный фрагмент."

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

0

65

Поправил

0

66

Уже лучше, но:
1) запятую необходимо всё-же удалить: "так называемый G-буфер (geometry buffer), для каждого пиксела сцены"
2) в первом фр. шейдере, кроме уже удалённой строки с diffmap, нужно доудалить ещё и "gl_TexCoord [0] = gl_MultiTexCoord0;".

Спасибо за внимание.

0

67

Вспомнил на досуге речь Остапа Бендера, не принимайте близко к сердцу, но опять ошибки.

"Light Indexed Deferred Rendering основан на другой идее - обычно, когда у нас очень много источников света, 1)то каждому фрагменту соответствует всего несколько источников света. Поэтому, при использовании этого подхода, в G-буфере для каждого фрагмента хранится специально запакованный список источников света (2)он обычно очень короткий), освещающих данный фрагмент.

После этого идет повторный вывод всей сцены 3), когда для каждого фрагмента извлекается список источников света и для каждого из них из специальной текстуры извлекаются его свойства и определяется его вклад в освещения фрагмента."
1) не нужно, логическая ципочка рушится из-за этого слова. Выкиньте его.
2) ну тут лучше поставить слово "обычно" в начало. Другой вариант - выделить его запятыми. Но то, что у вас написано явно неправильно.
3) пропущена запятая.

0

68

Всем привет, тоже начал изучать этот метод освещения, но застрял на оптимизации G-Буффера в 5ом примере, у меня просто напросто ничево не освещается =( но покапав шейдер выяснил примерно из за чего - из за строчки pp = pos * z / pos.z во втором шейдере... все, с этим разобрался =))) тока теперь источники света вместе с камерой убегают...
ну и как сделать в таком шейдере небо, и что бы шейдерные объекты тоже рендерились нормально(например водичка), без bumpMap униформы??? ну и последнее: как сделать туман?

Отредактировано Fluffy (2010-03-22 05:20:51)

0

69

Для неба никакой DS не нужен - можно просто пометить в стенсиле где небо и потом нариосвать его отдельно - освещать ведь его не надо

0

70

а как насчет того что источники света двигаются вместе с камерой и вращаются тоже сней... знаю что нужно не в орто проекции делать, но без нее вообще ну получается =( может подскажете иной способ просчета лайтов???

0

71

Просто даные в G-буфере хранятся в системе ккординат камеры, а источники света обычно задаются в мировой системе координат, т.е. нужно явно переводить источники из мировой системы в систему координат камеры, тогда и двигаться не будут

0

72

а как это сделать?? я пробовал, но удалось только убрать движение лайтов при вращении камеры по оси Z (или X, не помню):

Код:
function TfMain.MatrixOfConversion(FromCS, ToCS: TCoordinateSys): TMatrix;
var
  L1, L2, L3: Float;
  M1, M2: TMatrix;
begin
  L1 := VectorLength(ToCS.DirOX);
  L2 := VectorLength(ToCS.DirOY);
  L3 := VectorLength(ToCS.DirOZ);

  if (L1 <= 0) or (L2 <= 0) or (L3 <= 0) then
  begin
    Result:= NullMatrix;
    Exit;
  end;

  with ToCS do
  begin
    M1[0][0]:= DirOX[x] / L1; M1[0][1]:= DirOX[y] / L1; M1[0][2]:= DirOX[z] / L1; M1[0][3]:= 0;
    M1[1][0]:= DirOY[x] / L2; M1[1][1]:= DirOY[y] / L2; M1[1][2]:= DirOY[z] / L2; M1[1][3]:= 0;
    M1[2][0]:= DirOZ[x] / L3; M1[2][1]:= DirOZ[y] / L3; M1[2][2]:= DirOZ[z] / L3; M1[2][3]:= 0;
    M1[3][0]:= 0;             M1[3][1]:= 0;             M1[3][2]:= 0;             M1[3][3]:= 1;
  end;

  with FromCS do
  begin
    M2[0][0]:= DirOX[x] / L1; M2[0][1]:= DirOY[x] / L1; M2[0][2]:= DirOZ[x] / L1; M2[0][3]:= Center[x] - ToCS.Center[x];
    M2[1][0]:= DirOX[y] / L2; M2[1][1]:= DirOY[y] / L2; M2[1][2]:= DirOZ[y] / L2; M2[1][3]:= Center[y] - ToCS.Center[y];
    M2[2][0]:= DirOX[z] / L3; M2[2][1]:= DirOY[z] / L3; M2[2][2]:= DirOZ[z] / L3; M2[2][3]:= Center[z] - ToCS.Center[z];
    M2[3][0]:= 0;             M2[3][1]:= 0;             M2[3][2]:= 0;             M2[3][3]:= 1;
  end;

  Result:= MatrixMultiply(M1,M2);
end;

СК:

Код:
  CoordSysGlobal.DirOX  := Target.AbsoluteRight;
  CoordSysGlobal.DirOY  := Target.AbsoluteUp;
  CoordSysGlobal.DirOZ  := Target.AbsoluteDirection;
  CoordSysGlobal.Center := Target.AbsolutePosition;
  //
  CoordView.DirOX  := Camera.AbsoluteRight;
  CoordView.DirOY  := Camera.AbsoluteUp;
  CoordView.DirOZ  := Camera.AbsoluteDirection;
  CoordView.Center := Camera.AbsolutePosition;

ну и перевожу так:

Код:
  Pos:= VectorMake(lights[i].Position.x,lights[i].Position.y,lights[i].Position.z);
  M:= MatrixOfConversion(CoordSysGlobal,CoordView);
  Pos:= VectorMul(M,Pos);
  lights[i].Position.SetPoint(Pos[x],Pos[y],Pos[z]);

ну и функци VectorMul сам писал, может в этом и есть проблема? вот код функции:

Код:
function VectorMul(const M: TMatrix; Vec: TVector): TVector;
var
  i,j : Integer;
  r   : TVector;
  s   : Real;
begin
  for i:= 0 to 3 do
  begin
    s:= 0;

    for j:= 0 to 3 do
      s:= s+M[i,j]*Vec[j];

    r[i]:= s;
  end;

  Result:= r;
end;

Отредактировано Fluffy (2010-03-23 20:05:11)

0

73

А все, ненадо, разобрался =) спасибо за статью, отличная статья )))

0

74

Здравствуйте.

Возможно это уже не актуально, но в этой теме мелькало сообщение, что использование смешанных форматов в FBO сажает производительность. На самом деле из своего опыта могу сказать, что это не совсем так. Проблема не в смешивании форматов, а в операции glFramebufferTexture2D. Она работает быстро только если новая текстура имеет тот же формат и то же разрешение, что и старая. Если же формат или разрешение отличаются, то аттачить такую текстуру дороже, чем переключить FBO. С другой стороны, переключить FBO дороже, чем сменить текстуру в уже существующем FBO на другую такого же формата.  Работающий (для меня лично) выход такой - создать набор FBO для каждой комбинации форматов рендер-таргетов (кстати, некая аналогия с ID3D10InputLayout), переключать текстуры не переключая FBO пока форматы совпадают, и переключать FBO при смене формата.

0

75

вот еще вопрос. Насколько я знаю в Unreal Engine тоже используется Deferred Shading и там очень прикольно сделано столкновение источников света с поверхностями, как сделать так же??? вот скриншот для наглядности:
http://i066.radikal.ru/1003/1c/f563812deda8.jpg

0

76

Насколько я знаю, там очень много всего precomputed, посмотрите например их Light Mass
Я думаю, что скорее всего то что на скрине заранее посчитано

0

77

понятно, просто тоже хотелось такое сделать, я примерно знаю как нужно через RayCast но как его использовать в шейдере?

0

78

Вроде разобрался как столкновение с лучом сделать, а что делать если луч столкнулся? писать discard??
ну и плюс ко всему неизвесно как мне делать HDR мне придется создать еще один MRT буфер, а потом просчитать Deferred Shading, а потом уже просчитывать HDR при помощи нового буфера?

Отредактировано Fluffy (2010-04-03 18:01:09)

0

79

Steps3D,
нашёл ещё ошибку в шейдерной программе. Написано:
//
// Vertex Shader for deferred shading pass 2
//

varying vec3 pos;

void main(void)
{
    pos         = vec3 ( gl_ModelViewMatrix * gl_Vertex );          // transform point to world space
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}

//
// Fragment Shader for deferred shading pass 2
//

#extension GL_ARB_texture_rectangle: enable

uniform vec3 lightPos;
uniform sampler2DRect   posMap;
uniform sampler2DRect   normalMap;

void main (void)
{
    vec3    p  = texture2DRect ( posMap,    gl_FragCoord.xy ).xyz;
    vec3    n  = texture2DRect ( normalMap, gl_FragCoord.xy ).xyz;
    vec3    l  = normalize     ( lightPos - p );
    vec3    v  = normalize     ( -p );
    vec3    h  = normalize     ( l + v );
    float   diff = max         ( 0.2, dot ( l, n ) );
    float   spec = pow         ( max ( 0.0, dot ( h, n ) ), 40.0 );
   
    gl_FragColor = vec4 ( vec3 ( diff + spec ), 1.0 );
}
Здесь pos не нужен. Выкиньте его.

[правка] Steps3D, ещё, вот вы шейдеры в статье обновляете, а исходники нет! Это очень нехорошо; представьте, какой-нибудь кент читает вашу статью, потом смотрит примеры, видит несоответствие и пишет на геймдейве, что ваша статья глюченная и бажная.

Отредактировано DungeonLords (2010-07-17 17:39:08)

0

80

Нашёл неправильную точку: "Также доступны для скачивания откомпилированные версии для M$ Windows, Linux и . Mac OS X" Эту точку нужно в конец предложения.

Отредактировано DungeonLords (2010-07-19 16:12:07)

0

81

Так'с, точку исправили - отлично.

Вот я тут смотрел на ваш шейдер  и подумал, что он, наверное, опять бажный  :sceptic: .

Смотрим:
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;
}

//
// Fragment Shader for deferred shading pass 1
//
varying vec3 pos;
varying vec3 n;

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 );
}

Зачем вы ещё во фрагментном шейдере раз нормализировали данные? Варюинг n и так уже содержит нормализованные.

Отредактировано DungeonLords (2010-07-31 01:46:49)

0

82

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

0

83

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

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

ААА! Подозревал что-то такое...

Тогда другое предложение: не будем нормализироват их в вершинном шейдере, а нормализируем во фрагментном. Что скажете?

0

84

Up. Что скажете насчёт предложения из поста выше?

I

A)
Теперь о насущном. Steps3D, прошу вас разобраться с тем, что шейдеры из исходного кода НЕ соответствуют шейдерам из статьи. Это очень мешает. Тут надо также сказать о парадоксальной вещи в файлах ex1-p1.

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

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

И после этого я вижу в исходном коде, что вы испольузете как раз тот способ, который признали неправильным. Это парадокс!
Вот что написано:
varying vec3 pos;
varying vec3 n;
void main (void)
{
vec3 n2   = normalize ( n );

gl_FragData [0] = vec4 ( pos.xyz, gl_FragCoord.z*gl_FragCoord.w );
gl_FragData [1] = vec4 ( 0.5*n + vec3(0.5), 1.0 );
}

varying vec3 pos;
varying vec3 n;
void main(void)
{
pos = vec3 ( gl_ModelViewMatrix * gl_Vertex );   
n   = normalize ( gl_NormalMatrix *gl_Normal );           

gl_Position     = gl_ModelViewProjectionMatrix * gl_Vertex;
//Тут ещё одна ошибка, текстур у нас нет, а текстурные координаты мы зачем-то рассчитываем:
gl_TexCoord [0] = gl_MultiTexCoord0;

}

B)
Так же заметил надувательство. Есть в статье "Рис. 1". Перед ним расположены шейдеры первого прохода из этого следует, что рисунок иллюстрирует работу этих шейдеров первого прохода, что является неправдой. Для получения этого рисунка было задействовано сразу 4 шейдера, а не 2. Надо бы привести ещё 2 недостающих шейдера.

C)
В исходном коде первого примера есть строки:

    decalMap  = createTexture2D ( true, "../../Textures/oak.bmp" );
    stoneMap  = createTexture2D ( true, "../../Textures/block.bmp" );
    teapotMap = createTexture2D ( true, "../../Textures/Oxidated.jpg" );
...
program1.bind ();
program1.setTexture  ( "diffMap", 0 );
program1.unbind      ();

program2.bind ();
program2.setTexture  ( "posMap",    0 );
program2.setTexture  ( "normalMap", 1 );
program2.setTexture  ( "depthMap",  2 );
program2.unbind      ();
В этом примере не используются текстуры! Вы их загружаете и передаёте по ошибке!

II

У меня есть ещё парочка простых вопросов по исходному коду. Я программист Delphi, и C++ для меня не понятен. Прошу ответить, что такое:
    if ( (format = fpRgbaFormatWithPrecision ( 32 ) ) == 0 )
{
    printf ( "Floating-point textures not supported !\n" );
   
    return 1;
}
И что означает конкретно fpRgbaFormatWithPrecision.

Скажите также, зачем в первом примере вы сделали переменную "format" глобальной (а используете только в main)?

Также. Есть фрагмент кода:
if ( !buffer.attachColorTexture ( GL_TEXTURE_RECTANGLE_ARB, screenMapAdd, 1 ) )
    printf ( "buffer error with color attachment\n");
//...
bool FrameBuffer :: attachColorTexture ( GLenum target, unsigned texId, int no )
{
if ( frameBuffer == 0 )
    return false;

if ( target != GL_TEXTURE_2D && target != GL_TEXTURE_RECTANGLE_ARB && (target < GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB || target > GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB) )
    return false;

glBindTexture             ( target, colorBuffer [no] = texId );
glFramebufferTexture2DEXT ( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT + no, target, texId, 0 );

return true;
}
Меня интрересует, что означает GL_COLOR_ATTACHMENT0_EXT + no, как это вообще понимет компилятор? Типо  GL_COLOR_ATTACHMENT0_EXT + GL_COLOR_ATTACHMENT1_EXT? Разве так можно?

Отредактировано DungeonLords (2010-08-05 15:16:21)

0

85

Поалуйста цитируя куски кода, указывайте из какого именно он файла (так как к этой статье больше 20 различных шейдеров и перебирать все довольно тяжело
Насчет А) - а что там неправильно - нораль нормализуется и сохраняется как цвет - все правильно. Следующий проход преобразует ее обратно из цвета в нормаль

С) Примеры сквозные, эти тектсуры будут использоваться дальше, поэтому они есть, чтобы код для вывода сцены был общим

fpRgbaFormatWithPrecision - это моя функция (есть в исходниках), которая возвращает требуемый  формат текстуры

GL_COLOR_ATTACHMENT0_EXT - это константа, существует набор таких констант - GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_COLOR_ATTACHMENT2_EXT и т.д. Соседние отличаются на единицу, поэтому можно просто прибавлять номер к GL_COLOR_ATTACHMENT0_EXT

0

86

Насчет рисунка 1 - там четко написано, что на нем изображено содержимое буфера нормалей, как легко можно увидель второй проход просто копирует на выход содержимое  именно этого буфера

0

87

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

Насчет А) - а что там неправильно - нормаль нормализуется и сохраняется как цвет - все правильно. Следующий проход преобразует ее обратно из цвета в нормаль

Во фрагментном шейдере создаётся переменная n2, которая нормализируется и НЕ используется; зато используется n, которая уже НЕ содержит нормаль длиной до 1. Я говорю о файлах ex1-p1. И ещё одну ошибку я описал в вертексном шейдере красным комментарием.

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

С) Примеры сквозные, эти тектсуры будут использоваться дальше, поэтому они есть, чтобы код для вывода сцены был общим

ok, я вас понял.

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

fpRgbaFormatWithPrecision - это моя функция (есть в исходниках), которая возвращает требуемый  формат текстуры

Я искал её в вашем фреймворке, но visual studio её не нашёл. Как так?

Отредактировано DungeonLords (2010-08-08 03:10:48)

0

88

ex1-p1 исправил

Функция - в файлах fpTexture.cpp fpTexture.h
Выложу исправления вечером

0

89

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

Функция - в файлах fpTexture.cpp fpTexture.h

Нету тут такий файлов. Может быть, вы случайно выложили неполный фреймворк?

Прошу ещё ответить на мой вопрос.

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

Скажите также, зачем в первом примере вы сделали переменную "format" глобальной (а используете только в main)?

Отредактировано DungeonLords (2010-08-08 03:22:41)

0

90

Файлы есть в архиве к статье - в конце статьи есть ссылка
Отдельно их нет.

0


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


создать форум