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

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

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


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


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

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

91

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

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

Ой, я глупость сделал. Спасибо за помощь.

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

Выложу исправления вечером

Незачёт. Steps3D, боюсь, вы слишком мало внимания уделяете приведённым ошибкам. Открываю я файлы ex1-p1.vsh и ex1-p1.fsh и вижу:
//VSH
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;
}
//FSH
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*n2 + vec3(0.5), 1.0 );
}
Я же вам намекал, что двойная нормализация - это излишество. Вообще данный способ работы с нормалью используется также в освещении по Фонгу, поэтому я заглянул, как его делают авторы RenderMonkey. Знаете как? Они нормализируют n во фрагментном шейдере, а в вершинном у них написано 
= gl_NormalMatrix * gl_Normal. Также вы, непонимаю зачем, извратились, создав переменную n2. Приведённые шейдеры, на мой взгляд, должны выглядеть так:
//VSH
varying vec3 pos;
varying vec3 n;
void main(void)
{
pos = vec3 ( gl_ModelViewMatrix * gl_Vertex );    // transformed point to world space
              n   =  gl_NormalMatrix * gl_Normal;    // transformed n
gl_Position     = gl_ModelViewProjectionMatrix * gl_Vertex;
}
//FSH
varying vec3 pos;
varying vec3 n;
void main (void)
{
n   = 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 );
}

Скажите мне пожалуйста, как работают файлы ex1-p2.vsh и ex1-p2.fsh? Вот они:
//VSH
void main(void)
{
gl_Position     = gl_ModelViewProjectionMatrix * gl_Vertex;
}

//FSH
varying vec3 pos;
uniform sampler2DRect normalMap;
void main (void)
{
vec3 n  = texture2DRect ( normalMap, gl_FragCoord.xy ).xyz;
gl_FragColor = vec4 ( n, 1.0 );
}
Здесь меня очень интересует текстура во фрагментном шейдере. Откуда она взялась? Что в неё передавать? [правка] Сейчас посмотрел, стало ещё запутанней. Вроде как ничего вы туда и не передаёте. Или я ошибаюсь? Наведите, пожалуйста, на путь истинный.

Отредактировано DungeonLords (2010-08-11 20:08:02)

0

92

Скажите мне пожалуйста, как работают файлы ex1-p2.vsh и ex1-p2.fsh?

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

0

93

Хорошая ссылка: http://advances.realtimerendering.com/s … CryEngine3(SIGGRAPH%202010%20Advanced%20RealTime%20Rendering%20Course).pdf Здесь рассказано о хитростях всяких разных в отложенном освещении. Всё это есть будет в CryEngine3.
Steps3D, предлагаю добавить это во внушительный набор ссылок внизу вашей статьи.

Я уже с год пытаюсь по вашей статье и вашим примерам повторить то, что вы сделали ещё в примере №1. Никак не получается. Фактическая проблема в том, что команда glDrawBuffers (к слову, glReadBuffers тоже) заставляет приложение зависнуть намертво. Ума не приложу от чего, вроде бы делал всё как у вас, только обработку камеры выкинул... Может быть, вы просмотрите мой код?
Вот это моя процедура отрисовки:
procedure TForm1.GLDirectOpenGLRender(Sender: TObject;
  var rci: TRenderContextInfo);
var buffers:GLEnum;
begin
buffers := (GL_COLOR_ATTACHMENT0_EXT and GL_COLOR_ATTACHMENT1_EXT );
{Не уверен, Delphi эквивалент знаку | - это or или and...}

//buffer.bind ();
{Раскрываю этот ваш код.}
glFlush ();
glBindFramebufferEXT ( GL_FRAMEBUFFER_EXT, frameBuffer );
//glReadBuffer         ( GL_COLOR_ATTACHMENT0_EXT );
//glDrawBuffer         ( GL_COLOR_ATTACHMENT0_EXT );
{Если раскомменоирую эти две строчки, то прога зависнет.}
glViewport           ( 0, 0, 512, 512 );

//glDrawBuffers ( 2, @buffers );
{Если раскоментирую, зависнет.}

//reshape ( buffer.getWidth (), buffer.getHeight () );
{Раскрываю ваш код.}
  glViewport     ( 0, 0, 512, 512);
glMatrixMode   ( GL_PROJECTION );        // select projection matrix
glLoadIdentity ();                // reset projection matrix
glMatrixMode   ( GL_MODELVIEW );        // select modelview matrix
glLoadIdentity ();                // reset modelview matrix

{Это мне, скорее всего, не нужно.}
//glMultMatrixf ( m );
//glTranslatef  ( -pos.x, -pos.y, -pos.z );

GLSLHandleFirstPass.UseProgramObject;
{Так у нас включается использование шейдерной программы.}
glClear ( GL_COLOR_BUFFER_BIT and GL_DEPTH_BUFFER_BIT );
//camera.apply ();
{Раскрываю ваш код...}
  glViewport     ( 0, 0, 512, 512);
glMatrixMode   ( GL_PROJECTION );        // select projection matrix
glLoadIdentity ();                // reset projection matrix
glMatrixMode   ( GL_MODELVIEW );        // select modelview matrix
glLoadIdentity ();

MySphere.BuildList(rci);
{Вот так у нас отрисовываются все объекты, ошибки здесь быть НЕ может, ибо это отладенно и проверено временем.}

glActiveTextureARB ( GL_TEXTURE2_ARB );
glBindTexture      ( GL_TEXTURE_RECTANGLE_ARB, depthMap.Handle );
glCopyTexImage2D   ( GL_TEXTURE_RECTANGLE_ARB, 0, GL_DEPTH_COMPONENT, 0, 0, 512, 512, 0 );

GLSLHandleFirstPass.EndUseProgramObject;
{Там мы выключаем шейдерную программу.}
glFlush ();
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
//glViewport     ( 0, 0, 512, 512);
{Не уверен, что это здесь нужно, но если даже раскоментировать, ничего не изменится.}

  glClear     ( GL_COLOR_BUFFER_BIT );
glDisable   ( GL_DEPTH_TEST );
glDepthMask ( FALSE );

{  glActiveTextureARB ( GL_TEXTURE2_ARB );
  glBindTexture      ( GL_TEXTURE_RECTANGLE_ARB, depthMap.Handle ); }
{Это у вас тоже закоментированно.}

glActiveTextureARB ( GL_TEXTURE1_ARB );
glBindTexture      ( GL_TEXTURE_RECTANGLE_ARB, screenMapAdd.handle);

glActiveTextureARB ( GL_TEXTURE0_ARB );
  glBindTexture      ( GL_TEXTURE_RECTANGLE_ARB, screenMapMain.Handle );

  GLSLHandleSecondPass.UseProgramObject;

  MyHudSprite.Render(rci);
{Вот так мы отрисовываем плейн на весь экран, технология проверена.}

  GLSLHandleSecondPass.EndUseProgramObject;

glEnable    ( GL_DEPTH_TEST );
glDepthMask ( TRUE );
end;

Вот так я создаю текстуры и объекты:
procedure TForm1.FormCreate(Sender: TObject);
var depthBuffer :GLInt;
  format:GLEnum;
begin
MySphere:=TGLSphere.Create(nil);

MyHudSprite:=TGLHudSprite.Create(nil);

depthMap:=TGLTextureHandle.Create;
depthMap.AllocateHandle;
glBindTexture   ( GL_TEXTURE_RECTANGLE_ARB, depthMap.Handle  );
glTexParameteri ( GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameteri ( GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
glTexParameteri ( GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
glTexParameteri ( GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
glTexImage2D     ( GL_TEXTURE_RECTANGLE_ARB, 0, GL_DEPTH_COMPONENT, 512, 512, 0,
                   GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, nil );

format:=GL_RGBA32F_ARB;
//screenMapMain := buffer.createColorRectTexture ( GL_RGBA, format );
{Раскрываю код...}
screenMapMain:=TGLTextureHandle.Create;
screenMapMain.AllocateHandle;
glPixelStorei   ( GL_UNPACK_ALIGNMENT, 1 ); //
glBindTexture   ( GL_TEXTURE_RECTANGLE_ARB, screenMapMain.Handle );
glTexImage2D    ( GL_TEXTURE_RECTANGLE_ARB, 0, format, 512, 512, 0,
                      GL_RGBA, GL_UNSIGNED_BYTE, nil );

glTexParameteri ( GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_NEAREST   );
glTexParameteri ( GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST   );

glTexParameteri ( GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP );
glTexParameteri ( GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP );

//screenMapAdd  := buffer.createColorRectTexture ( GL_RGBA, format );
{Раскрываю код...}
screenMapAdd:=TGLTextureHandle.Create;
screenMapAdd.AllocateHandle;
glPixelStorei   ( GL_UNPACK_ALIGNMENT, 1 );
glBindTexture   ( GL_TEXTURE_RECTANGLE_ARB, screenMapAdd.Handle );
glTexImage2D    ( GL_TEXTURE_RECTANGLE_ARB, 0, format, 512, 512, 0,
                      GL_RGBA, GL_UNSIGNED_BYTE, nil );

glTexParameteri ( GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_NEAREST   );
glTexParameteri ( GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_NEAREST   );

glTexParameteri ( GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP );
glTexParameteri ( GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP );

glGenFramebuffersEXT(1, @framebuffer);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framebuffer);
// Создаём буфер вывода.
glGenRenderbuffersEXT(1, @depthBuffer);
glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, depthBuffer );
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, 512, 512);
// Присоединяем буфер вывода - как буфер глубины.
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
    GL_RENDERBUFFER_EXT, depthBuffer);
//glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
//glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);

//glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, depthBuffer);

//**** attach to nexture
glBindTexture             ( GL_TEXTURE_RECTANGLE_ARB, screenMapMain.Handle );
glFramebufferTexture2DEXT ( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_RECTANGLE_ARB, screenMapMain.Handle, 0 );
//**** attach to nexture
glBindTexture             ( GL_TEXTURE_RECTANGLE_ARB, screenMapAdd.Handle );
glFramebufferTexture2DEXT ( GL_FRAMEBUFFER_EXT,GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_RECTANGLE_ARB, screenMapAdd.Handle, 1);

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
{glDrawBuffer(GL_BACK);
glReadBuffer(GL_BACK); }
{Код выше приводит к зависанию.}
end;

Ваши примеры запускаются... Шейдеры использую тоже ваши.

Отредактировано DungeonLords (2010-09-04 22:44:32)

0

94

[предыдущий пост остаётся в силе Я предполагаю, что Steps3D, возможно, создаёт ещё и стинсил FBO, нет? Там код активации выполняется в зависимости от флага (flags = theFlags;) , но я не понял, где вообще автор эти флаги устанавливал.]

http://aras-p.info/texts/CompactNormalStorage.html - сохранение содержимого нормалей для маленького G-буфера, можно добавить ссылку в статью.

0

95

Добавил

0

96

}{орошо.

Steps3D,
Не существует форматов GL_ALPHA_32F_ARB и GL_RGBA_32F_ARB. Правильно называть эти форматы GL_ALPHA32F_ARB и GL_RGBA32F_ARB.

Я не понимаю, что означает строчка if ( stencilFormat != 0 ), поэтому мне вот что непонятно. Вы создаёте стенсил буфер?
glGenRenderbuffersEXT        ( 1, &stencilBuffer );
glBindRenderbufferEXT        ( GL_RENDERBUFFER_EXT, stencilBuffer );
glRenderbufferStorageEXT     ( GL_RENDERBUFFER_EXT, stencilFormat, width, height );
glFramebufferRenderbufferEXT ( GL_FRAMEBUFFER_EXT,  GL_STENCIL_ATTACHMENT_EXT,
                                   GL_RENDERBUFFER_EXT, stencilBuffer );

0

97

Исправил, спасибо
Да, класс FrameBuffer поддерживает создание стенсила

0

98

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

Да, класс FrameBuffer поддерживает создание стенсила

Нет, нет. Я спрашивал (имел ввиду): создаёте ли вы в своём первом примере для отложенного освещения стинсил-буфер? Плюс, создаёте ли вы рендер-буфер? Я запутался в вашем Cи примере. o.O

0

99

Я создаю рендербуфер (точнее фреймбуфер с рендербуфером), в первом примере стенсил не используется, только глубина и цветовые буфера.
Я использую класс FrameBuffer, получающий размеры буфера и битовую маску дополнительных буферов (глубина и стенсил), по умолчния маска нулевая, т.е. ни глубины ни стенсила не создается, только цветовые буфера.
Цветовые буфера подключаются через метод attachColorTexture/attach3DTextureSlice

+1

100

Спасибо.

Скачал только что ещё раз исходники к статье, потому что не поверил, что в уже скачанных опять ошибка.
Итак, вижу файлы ex1-p2.

varying vec3 pos;

uniform sampler2DRect normalMap;

void main (void)
{
vec3 n  = texture2DRect ( normalMap, gl_FragCoord.xy ).xyz;

gl_FragColor = vec4 ( n, 1.0 );
}

//
// DS vertex shader 2
//

void main(void)
{
gl_Position     = gl_ModelViewProjectionMatrix * gl_Vertex;
}

Что во фрагментном шейдере делает "varying vec3 pos;"? Дай бог, чтобы оптимизатор GLSL его удалял.

Ну и нехорошо получилось то, что во втором шейдере есть "шапка", а в первом нет.

Отредактировано DungeonLords (2010-10-23 23:59:57)

0

101

up.

Ну что скажете?

0

102

Сегодня исправлю, спасибо

0

103

Здравствуйте steps3D
Скажите, а почему во фрагментном шейдере второго прохода используется texture2DRect а не просто texture2D, и в качестве текстурных координат gl_FragCoord.xy
Почему не использовать просто texture2D( Map, gl_TexCoord[0].xy )

0

104

Никакой принципиальной разницы нет, просто мне было так удобнее.
Кроме того для использования gl_TexCoord их надо задавать и передавть в вершинном шейдере.

0

105

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

Скажите, если я использую для хранения vertexPos текстуру формата RGBA8 и упаковываю координаты вершин как в Вашей статье, то как быть со знаком? Отрицательных координат не будет, они все станут положительными?

Фильтрация текстурам формата RGBA8, хранящим координаты вершины/глубину противопоказана?

Как будет работать альфа тест, в смысле в какой gl_FragData[ ].а записывать значение альфы, вывод производится ведь сразу в несколько буферов

Вопросы могут показаться глупыми, я новичек

0

106

Не надо упаковывать координаты в RGBA8 - в 32 бита вы много не запакуете.
Гораздо лучше брать RGBA_16F или хранить только zEye, а оно всегда одного знака
Насчет фильтрации - смотря для чего, но для deferred rendering противопоказана.
Про альфа-тест не знаю, лучше его явно выполнять в шейдере через discard

0

107

Здравствуйте, Steps, делаю все как указано в вашей статье, но получаю следующее изображение:
http://s9.uploads.ru/t/Lpbkq.png
В чем можетбыть проблема?

0

108

Забыл добавить, изображение должно получиться, как на 2-ой картинке в вашей статье.

0

109

А какие получются буфера с нормалями - там все в порядке?
Так же как вариант - не получается ли при вычислениях NaNы или что-то вроде них?
Для начала бы хорошо вывести все буфера, какие получются

0

110

Спасибо Steps3D. Я просто не внимательно читал вашу статью.
   

Код:
   
    if ( isExtensionSupported ( "GL_ARB_texture_float" ) )
    {
        format1 = GL_INTENSITY32F_ARB;
        format2 = GL_RGBA8;
    }
    
    unsigned screenMap0 = buffer.createColorRectTexture ( GL_RGBA, format1 );
    unsigned screenMap1 = buffer.createColorRectTexture ( GL_RGBA, format2 );
    unsigned screenMap2 = buffer.createColorRectTexture ( GL_RGBA, format2 );

Этот пример на C++ у вас в статье, соответственно screenMap0, т.е. posMap я создаю с форматом GL_INTENSITY32F_ARB.
Применяя первый шейдер, с той же статьи:

Код:
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 );
}

Я получаю результат:
http://s9.uploads.ru/t/Z8v3S.png

Когда же я поменял формат на GL_RGBA32F_ARB то получаю изображение как на картинке ниже. (отмеченное "pos"):
http://savepic.net/4605334m.jpg

Отредактировано KD (2014-02-12 13:02:24)

0

111

Здравствуйте, реализовал один из ваших способов Deferred Shading и на данный момент столкнулся с одним, непонятным мне, багом. На бликах появляется некая ступенчатость, особенно когда полигоны близко от позиции камеры. Чтобы было более понятнее о чем речь, вот скрин из моей программы:

http://s019.radikal.ru/i644/1404/69/b0dd77333658.png

Посмотрел все программы приложенные к статье и увидел такой же эффект:

http://s020.radikal.ru/i722/1404/a1/0cab3cb4ce9c.png

Подскажите с чем это может быть связано? (может с видео Geforce GTX 570?) Как устранить этот эффект? И можно ли его устранить вообще в данной реализации?

0

112

Проблема может быть в недостаточной точности нормали, может быть стоит попробовать испольтзовать для хранения нормали 16-битовые float

0

113

Спасибо! 16-битовые float практически убирают "лесенку" на бликах. Ещё, чтобы полностью убрать эффект добавил normalize:
vec3 n = normalize( 2.0*(texture2DRect ( normalMap, gl_FragCoord.xy ).xyz - vec3 ( 0.5) ) );

0


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


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