Хорошая ссылка: 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)