|
|
|
Канал Игры Мечты: «[OpenGL] Есть кто?» |
|
|
Варсик
545 EGP
    Рейтинг канала: 4(81) Репутация: 117 Сообщения: 4041 Откуда: Москва Зарегистрирован: 22.12.2002
 |
|
А то вопросы задавать некому... На геймдеве народ или глупый, или ленивый (скорее 2-е)
_________________ WARNING: By reading this post you accept that this post is genius. |
|
|
Digited
271 EGP
   Рейтинг канала: 4(99) Репутация: 49 Сообщения: 932
Зарегистрирован: 24.08.2004
 |
|
Смотря какие вопросы.
ps Jurec на некоторое время ушел в офф.
|
|
|
VBKesha
817 EGP
      Рейтинг канала: 3(31) Репутация: 132 Сообщения: 3330 Откуда: обл.Брянская г. Трубчевск Зарегистрирован: 07.12.2005
 |
|
Может я чем смогу помочь.
|
|
|
Варсик
545 EGP
    Рейтинг канала: 4(81) Репутация: 117 Сообщения: 4041 Откуда: Москва Зарегистрирован: 22.12.2002
 |
|
Ну хорошо, вопрос про pBuffer, если кто знает что это такое. Не могу отрисовать в этот буфер...
Даже наверно так: Как сделать эффект внешней камеры... а-ля Х3. Из того что знаю я:
Самый медленный: Сделать glPerspective, отрендерить сцену, сделать glCopyTexSubImage и потом как текстуру накладывать.
Быстрее: Через WGL_ARB_pbuffer и иже с ним. вот тут у меня ничего не получается... Создаю контекст, выбираю его, рендерю туда, выбираю стандартный, рендерю сцену, потом через glOrtho пытаюсь нарисовать квадрат и наложить текстуру, к которой прикручен этот буфер. Получаю цветной прямоугольник (цвет сам задаю)
Ещё быстрее: Пока не рассматривал, но EXT_framebuffer_object вроде то что надо.
Так как пишу скрин сейвер необходимы все 3 варианта (или больше если найдете) Вот собсно вопрос: Как работать с pBuffer'ом?
_________________ WARNING: By reading this post you accept that this post is genius. |
|
|
VBKesha
817 EGP
      Рейтинг канала: 3(31) Репутация: 132 Сообщения: 3330 Откуда: обл.Брянская г. Трубчевск Зарегистрирован: 07.12.2005
 |
|
Погляди в этих примерах:
http://www.codesampler.com/oglsrc/oglsrc_7.htm#ogl_offscreen_rendering
|
|
|
Варсик
545 EGP
    Рейтинг канала: 4(81) Репутация: 117 Сообщения: 4041 Откуда: Москва Зарегистрирован: 22.12.2002
 |
|
За наводку на сайт большое спасибо.
_________________ WARNING: By reading this post you accept that this post is genius. |
|
|
Jurec
348 EGP
   Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006
 |
|
А я ужо приехал! :Р
glCopyTexSubImage2D делал для pBuffer`а?
http://www.delphi3d.net/download/arbrendertex.zip
http://www.delphi3d.net/download/pbuffer.zip
Вот - отличные исходники на Делфи.
Но EXT_framebuffer_object рулит в любом случае, т.к. это быстрее намного, контекст не надо создавать и это кросс-платформеная вещь. pBuffer же требует wgl расширения - т.е. только для винды (наверно можно как-то это обойти, но я не знаю альтернатив wgl в данном случае).
_________________ MOV topka, C++ |
|
|
Варсик
545 EGP
    Рейтинг канала: 4(81) Репутация: 117 Сообщения: 4041 Откуда: Москва Зарегистрирован: 22.12.2002
 |
|
Jurec : |
glCopyTexSubImage2D делал для pBuffer`а?
|
Нет. Так как, насколько я понял pBuffer от ARB должен работать без этой помманды, если включено расширение WGL_ARB_render_texture
Jurec : |
Но EXT_framebuffer_object рулит в любом случае
|
Согласен. Я буду делать различные реализации.
1) Рендер в теущий контекст, сброс инфы в текстуру, рендер тудаже нормальной сцены
2) Через ARB
3) Через EXT
_________________ WARNING: By reading this post you accept that this post is genius. |
|
|
Jurec
348 EGP
   Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006
 |
|
Кидай код работы с этой шнягой.
_________________ MOV topka, C++ |
|
|
tribunal
50 EGP
 Рейтинг канала: 1(6) Репутация: 4 Сообщения: 21 Откуда: Санкт-Петербург Зарегистрирован: 02.11.2006
 |
|
Присоединяюсь к автору темы. Активно изучаю OpenGL. Пока только теорию
Нахожусь в глубоком раздумье: стоит ли сразу OpenGL изучать или тот же Ogre3d
Не знаю, как провести сравнительный анализ
|
|
|
Варсик
545 EGP
    Рейтинг канала: 4(81) Репутация: 117 Сообщения: 4041 Откуда: Москва Зарегистрирован: 22.12.2002
 |
|
tribunal : |
стоит ли сразу OpenGL изучать
|
Я как-то посмотрел на TrueVision3D... На нем Бруно Р. Маркос свои игрушки делал... Типа BfE и BfY4 И понял что надо писать свой... Так как там двиг был тормознутый...
_________________ WARNING: By reading this post you accept that this post is genius. |
|
|
Варсик
545 EGP
    Рейтинг канала: 4(81) Репутация: 117 Сообщения: 4041 Откуда: Москва Зарегистрирован: 22.12.2002
 |
|
Код: |
unit ExternalCamera;
interface
uses gl, glu, glext, SceneObjects, Camera, Windows;
type
TExtCamera=class(TCamera)
private
fWidth:Word;
fHeight:Word;
fX:Integer;
fY:Integer;
fVisible:Boolean;
fUpdating:Boolean;
hARB:THandle;
fInited:Boolean;
Image:PGLbyte;
bufTex:GLuint;
public
property Width:Word read fWidth write fWidth;
property Height:Word read fHeight write fHeight;
property Visible:Boolean read fVisible write fVisible;
property Updating:Boolean read fUpdating write fUpdating;
property X:Integer read fX Write fX;
property Y:Integer read fY Write fY;
constructor Create(AOwnerHandle:THandle); overload;
destructor Destroy; override;
procedure ExRender;
procedure Draw; override;
procedure Activate;
end;
implementation
uses GlobalVars, Texture, Mesh;
constructor TExtCamera.Create(AOwnerHandle:THandle);
var
iAttr:Array [0..16] of Integer;
fAttr:Real;
Formats:GLint;
Data:GLuint;
tData:Pointer;
begin
Inherited Create(AOwnerHandle);
fInited:=False;
If not IsARBPBuffer then Exit;
iAttr[0]:=WGL_DRAW_TO_PBUFFER_ARB;
iAttr[1]:=GL_TRUE;
iAttr[2]:=WGL_DEPTH_BITS_ARB;
iAttr[3]:=24;
iAttr[4]:=WGL_RED_BITS_ARB;
iAttr[5]:=8;
iAttr[6]:=WGL_GREEN_BITS_ARB;
iAttr[7]:=8;
iAttr[8]:=WGL_BLUE_BITS_ARB;
iAttr[9]:=8;
iAttr[10]:=WGL_PIXEL_TYPE_ARB;
iAttr[11]:=WGL_TYPE_RGBA_ARB;
iAttr[12]:=WGL_SUPPORT_OPENGL_ARB;
iAttr[13]:=GL_TRUE;
if IsARBPBufferTex then
begin
iAttr[14]:=WGL_BIND_TO_TEXTURE_RGBA_ARB;
iAttr[15]:=GL_TRUE;
iAttr[16]:=0;
end
else
iAttr[14]:=0;
fAttr:=0;
fInited:=wglChoosePixelFormatARB(hDC, @iAttr, nil, 1, @Formats, @Data);
if fInited then
begin
iAttr[0]:=WGL_TEXTURE_FORMAT_ARB;
iAttr[1]:=WGL_TEXTURE_RGBA_ARB;
iAttr[2]:=WGL_TEXTURE_TARGET_ARB;
iAttr[3]:=WGL_TEXTURE_2D_ARB;
iAttr[4]:=0;
hARB:=wglCreatePbufferARB(hDC, Formats, 256, 256, @iAttr);
hDC:=wglGetPbufferDCARB(hARB);
wglDeleteContext(hRC);
hRC:=wglCreateContext(hDC);
wglQueryPbufferARB( hARB, WGL_PBUFFER_WIDTH_ARB, @Formats);
fWidth:=Formats;
wglQueryPbufferARB( hARB, WGL_PBUFFER_HEIGHT_ARB, @Formats);
fHeight:=Formats;
GetMem(tData, fWidth * fHeight * 4);
Cameras.AddCamera(Self);
glGenTextures(1, @bufTex);
glBindTexture(GL_TEXTURE_2D, bufTex);
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glPixelStorei ( GL_UNPACK_ALIGNMENT, 1 ); // set 1-byte alignment
glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameteri ( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexImage2D ( GL_TEXTURE_2D, 0, 4, fWidth, fHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, tData );
FreeMem(tData, fWidth * fHeight * 4);
end;
end;
Destructor TExtCamera.Destroy;
begin
wglDeleteContext(hRC);
wglReleasePbufferDCARB(hARB, hDC);
wglDestroyPbufferARB(hARB);
Inherited Destroy;
end;
Procedure TExtCamera.ExRender;
var
lDC, lRC:THandle;
begin
if not fVisible then Exit;
If not fUpdating then Exit;
lRC:=wglGetCurrentContext;
lDC:=wglGetCurrentDC;
if not wglMakeCurrent(hDC, hRC) then Exit;
glViewport(0,0,fWidth,fHeight);
glEnable( GL_TEXTURE_2D );
glMatrixMode(GL_PROJECTION);
glPushMatrix;
glLoadIdentity;
gluPerspective(45.0, fWidth/fHeight, 0.1, 10000);
glMatrixMode(GL_MODELVIEW);
glEnable( GL_TEXTURE_2D );
glClearColor(0.5,0.5,0.5,0);
glClear(GL_DEPTH_BUFFER_BIT xor GL_COLOR_BUFFER_BIT);
glPushMatrix;
gluLookAt(Position.X, Position.Y, Position.Z, Rotation.X, Rotation.Y, Rotation.Z, 0, 1, 0 );
Scene.Render;
glPopMatrix;
glMatrixMode(GL_PROJECTION);
glPopMatrix;
glMatrixMode(GL_MODELVIEW);
glBindTexture( GL_TEXTURE_2D, bufTex );
if not IsARBPBufferTex then
glCopyTexImage2D(GL_TEXTURE_2D,0,GL_LUMINANCE,0,0,fWidth,fHeight,0); wglMakeCurrent(lDC, lRC);
end;
Procedure TExtCamera.Draw;
const
T1:R2Point=(S:0;T:0);
T2:R2Point=(S:1;T:0);
T3:R2Point=(S:1;T:1);
T4:R2Point=(S:0;T:1);
var
V1,V2,V3,V4:R3Point;
VTmp, VTmp2:R3Point;
err:Cardinal;
begin
if not fVisible then Exit;
glEnable( GL_TEXTURE_2D );
glBindTexture( GL_TEXTURE_2D, bufTex );
if IsARBPBufferTex then
if not wglBindTexImageARB( hARB, WGL_FRONT_LEFT_ARB ) then Exit;
glDisable( GL_DEPTH_TEST);
glMatrixMode( GL_PROJECTION );
glPushMatrix;
glLoadIdentity;
glOrtho( 0, 500, 500, 0, 0, 1 );
glMatrixMode( GL_MODELVIEW );
glPushMatrix;
glLoadIdentity;
glBindTexture(GL_TEXTURE_2D, bufTex);
glBegin( GL_QUADS );
glTexCoord2f( 0, 1 );
glVertex2i( 0, 0 );
glTexCoord2f( 0, 0 );
glVertex2i(0,fHeight);
glTexCoord2f(1,0);
glVertex2i(fWidth, fHeight);
glTexCoord2f(1,1);
glVertex2i(fWidth, 0);
glEnd;
glPopMatrix;
glMatrixMode( GL_PROJECTION );
glPopMatrix;
glMatrixMode( GL_MODELVIEW );
glEnable( GL_DEPTH_TEST);
glBindTexture( GL_TEXTURE_2D, bufTex );
if IsARBPBufferTex then
wglReleaseTexImageARB( hARB, WGL_FRONT_LEFT_ARB );
end;
procedure TExtCamera.Activate;
begin
fVisible:=True;
fUpdating:=True;
end;
|
_________________ WARNING: By reading this post you accept that this post is genius. |
|
|
Jurec
348 EGP
   Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006
 |
|
http://www.delphi3d.net/download/arbrendertex.zip
Погляди сюда всё таки.
Я просто не работал с pBuffer`ом, поэтому сказать конкретно не могу - да и код не из лёгких - надо отлаживать.
Тут могу только предпологать что:
Warstone : |
Код: |
glGenTextures(1, @bufTex); glBindTexture(GL_TEXTURE_2D, bufTex); |
|
создает текстуру не в том контексте.
Warstone : |
Код: |
glTexImage2D ( GL_TEXTURE_2D, 0, 4, fWidth, fHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, tData ); |
|
1) GL_RGB?
2) Почему то думаю что это вообще делать не надо..
Warstone : |
Код: |
glBindTexture( GL_TEXTURE_2D, bufTex );
if not IsARBPBufferTex then
glCopyTexImage2D(GL_TEXTURE_2D,0,GL_LUMINANCE,0,0,fWidth,fHeight,0); wglMakeCurrent(lDC, lRC); |
|
1) Bind в каком контексте?
2) Почему GL_LUMINANCE?
добавлено спустя 4 минуты:
А еще может быть трабл с инициализацией камеры.
Погляди тот пример что я дал - там инит другой..
_________________ MOV topka, C++
Последний раз редактировалось: Jurec (10:46 10-08-2007), всего редактировалось 2 раз(а) |
|
|
Варсик
545 EGP
    Рейтинг канала: 4(81) Репутация: 117 Сообщения: 4041 Откуда: Москва Зарегистрирован: 22.12.2002
 |
|
Jurec : |
создает текстуру не в том контексте.
|
А есть разница? Не знал.
Add:
Посмотрел... строит в контексте основной камеры. То есть там-же где и рендер происходит.
Jurec : |
2) Почему то думаю что это вообще делать не надо..
|
Очень может быть
Jurec : |
1) Bind в каком контексте?
|
В контексте pBuffer'а
Jurec : |
2) Почему GL_LUMINANCE?
|
Забей, считай что IsARBPBufferTex=True;
Jurec : |
А еще может быть трабл с инициализацией камеры.
|
Может, но вроде хендл на pBuffer я получаю (он <> 0), так что wglCreatePbufferARB ошибку не дает...
добавлено спустя 3 минуты:
Jurec : |
Погляди сюда всё таки.
|
А тамошние CG компоненты откуда взять?
добавлено спустя 1 минуту:
Jurec : |
Погляди тот пример что я дал - там инит другой..
|
Строил работу по http://www.steps3d.НАРОД.ru/tutorials/render-to-texture-tutorial.html
_________________ WARNING: By reading this post you accept that this post is genius.
Последний раз редактировалось: Варсик (11:13 10-08-2007), всего редактировалось 3 раз(а) |
|
|
Jurec
348 EGP
   Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006
 |
|
Warstone : |
wglCreatePbufferARB ошибку не дает...
|
Ошибки и не будет, просто не будет работать.
Warstone : |
А тамошние CG компоненты откуда взять?
|
Смотри модуль DynTex.pas - компилить тебе ничего не надо, впринципе.
Код: |
// Pixel format attributes:
PFATTRIBS: array [0..16] of Integer =
(
WGL_SUPPORT_OPENGL_ARB, GL_TRUE,
WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_ARB,
WGL_ACCELERATION_ARB, WGL_FULL_ACCELERATION_ARB,
WGL_COLOR_BITS_ARB, 32,
WGL_DEPTH_BITS_ARB, 24,
WGL_STENCIL_BITS_ARB, 0,
// We're creating a PBuffer that can be bound as a texture.
WGL_DRAW_TO_PBUFFER_ARB, GL_TRUE,
WGL_BIND_TO_TEXTURE_RGBA_ARB, GL_TRUE,
0
);
// PBuffer attributes:
PBATTRIBS: array [0..8] of Integer =
(
WGL_PBUFFER_LARGEST_ARB, 0,
WGL_TEXTURE_FORMAT_ARB, WGL_TEXTURE_RGBA_ARB,
WGL_TEXTURE_TARGET_ARB, WGL_TEXTURE_2D_ARB,
WGL_MIPMAP_TEXTURE_ARB, GL_TRUE,
0
);
|
Warstone : |
Код: |
iAttr[0]:=WGL_DRAW_TO_PBUFFER_ARB;
iAttr[1]:=GL_TRUE;
iAttr[2]:=WGL_DEPTH_BITS_ARB;
iAttr[3]:=24;
iAttr[4]:=WGL_RED_BITS_ARB;
iAttr[5]:=8;
iAttr[6]:=WGL_GREEN_BITS_ARB;
iAttr[7]:=8;
iAttr[8]:=WGL_BLUE_BITS_ARB;
iAttr[9]:=8;
iAttr[10]:=WGL_PIXEL_TYPE_ARB;
iAttr[11]:=WGL_TYPE_RGBA_ARB;
iAttr[12]:=WGL_SUPPORT_OPENGL_ARB;
iAttr[13]:=GL_TRUE;
if IsARBPBufferTex then
begin
iAttr[14]:=WGL_BIND_TO_TEXTURE_RGBA_ARB;
iAttr[15]:=GL_TRUE;
iAttr[16]:=0;
end
else
iAttr[14]:=0;
fAttr:=0;
|
|
Сравни..
_________________ MOV topka, C++
Последний раз редактировалось: Jurec (11:19 10-08-2007), всего редактировалось 1 раз |
|
|
Варсик
545 EGP
    Рейтинг канала: 4(81) Репутация: 117 Сообщения: 4041 Откуда: Москва Зарегистрирован: 22.12.2002
 |
|
Jurec : |
Ошибки и не будет, просто не будет работать.
|
Там если формат пикселя кривой, то он 0 хендл возвращает.
Ну и? Для инициализации Формата пикселя почти одно и то-же. Единственно не понимаю смысл WGL_ACCELERATION_ARB, щас вставлю - посмотрю
добавлено спустя 3 минуты:
Warstone : |
щас вставлю - посмотрю
|
Вставил. Не помогло.
_________________ WARNING: By reading this post you accept that this post is genius.
Последний раз редактировалось: Варсик (11:29 10-08-2007), всего редактировалось 1 раз |
|
|
Jurec
348 EGP
   Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006
 |
|
Jurec : |
Смотри модуль DynTex.pas
|
Смотрел? Там всё работает - вот от этого и пляши.
_________________ MOV topka, C++
Последний раз редактировалось: Jurec (11:42 10-08-2007), всего редактировалось 1 раз |
|
|
Варсик
545 EGP
    Рейтинг канала: 4(81) Репутация: 117 Сообщения: 4041 Откуда: Москва Зарегистрирован: 22.12.2002
 |
|
Jurec : |
Смотрел? Там всё работает - вот от этого и пляши.
|
Понимаешь какая штука... Для того чтобы использовать glCopyTexSubImage и с его помощью делать камеры... pBuffer вообще не нужен... И зачем они его там прикрутили - непонятно. Видно не знают что делают. Тогда проще рендерить все в 1 DC и просто его очищать 2 раза. Ведь pBuffer нужен чтобы как-раз НЕ делать glCopyTextSubImage...
_________________ WARNING: By reading this post you accept that this post is genius. |
|
|
Jurec
348 EGP
   Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006
 |
|
Warstone : |
Видно не знают что делают.
|
Читай исходники внимательно.
Там 3 класса.
1) Чистый glCopyTextSubImage
2) pBuffer с glCopyTextSubImage
3) pBuffer через WGL_ARB_render_texture [БЕЗ glCopyTextSubImage]
_________________ MOV topka, C++ |
|
|
Варсик
545 EGP
    Рейтинг канала: 4(81) Репутация: 117 Сообщения: 4041 Откуда: Москва Зарегистрирован: 22.12.2002
 |
|
Кстати, 8 августа анонсирован OpenGL 3.0!
Подробнее: http://www.opengl.org/cgi-bin/ubb/ultimatebb.cgi?ubb=get_topic;f=3;t=015351;p=0
добавлено спустя 41 минуту:
Jurec : |
Читай исходники внимательно.
|
Ну кто-же мог подумать... Я нашел ошибку... Даже если не используются Дисплейные списки... Они есть... По одному на DC... Я прав? Короче все решила строчка: wglShareLists(curRC, hRC);
_________________ WARNING: By reading this post you accept that this post is genius.
Последний раз редактировалось: Варсик (20:40 10-08-2007), всего редактировалось 2 раз(а) |
|
|
|
|
|
Канал Игры Мечты: «[OpenGL] Есть кто?» |
|