Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

BitBlt - где косяк? [D7, WinXP]


Страницы:   1 2

evil_mike ©   (2008-07-15 14:25:00) 

Доброго времени суток.
У меня следующий вопрос.

procedure drawbg(draw:string);
var n,i:integer;
   cursorpos : tpoint;
begin
getcursorpos(cursorpos);

if draw='tex' then
begin
 for n:=0 to mapobjectnumber-1 do model[n].draw;
end;

if draw='color' then
begin
 for n:=0 to mapobjectnumber-1 do model[n].drawcoloured(n,n,n);
 BitBlt(colormap.Canvas.Handle, 0, 0, 32, 32, wglGetCurrentDC, cursorpos.x , cursorpos.y, SRCCOPY)=true then exit;
end;

end;

В первом условии объекты рисуются с текстурами, во втором - цветом. По отдельности они работают отлично. Но если я сначала рисую в цвете, а потом с текстурой - в colormap оказывается изображение с текстурой..кто в курсе, почему так?


evil_mike   (2008-07-21 13:42:00) [1]

Если кому-то пригодится, я проблему решил запихнув glfinish(); после отрисовки цветом. На каком-то англоязычном форуме нашел что-то типа того что опенгл отдает управление окну после того как все сам отрисует, поэтому битблт и работает только после всех процедур опенгл..а глфиниш насильно заставляет его передать управление окну.


evil_mike   (2008-07-15 22:42:00) [2]

Хм..если все так серьезно, наверно проще отказаться от использования битблт..кроме него-то все нормально работает ) Спасибо за помощь


Renegat   (2008-07-15 22:32:00) [3]

Тогда я воще не понимаю. А код целиком, надеюсь, не особо секретен? Если это так, выложи куда-нить на файлообменник. Протрассировать его надо. В отладчике. И при каждом вызове какой-то функции мониторить изменение флагов состояния ОГЛ.


evil_mike   (2008-07-15 22:27:00) [4]

Сейчас нет.


Renegat   (2008-07-15 22:24:00) [5]

> [23] evil_mike   (15.07.08 22:21)

оно понятно. Эначит, так или иначе ты используешь выборку, так?


evil_mike   (2008-07-15 22:21:00) [6]

? Потому что в одной модели несколько объектов.


Renegat   (2008-07-15 22:19:00) [7]

Ну а зачем же тогда glPushName? Видимо, где-то в коде завуалировано. Может, этот код был получен методом копи-паста?


evil_mike   (2008-07-15 22:06:00) [8]


> GL_RENDER на GL_SELECT

У меня таких вообще нету..


Renegat   (2008-07-15 22:04:00) [9]

Ты, я так понимаю, юзаешь выборку средствами OpenGL. А там, когда переключаются буферы - с GL_RENDER на GL_SELECT - отрисовки в GL_RENDER тупо НЕТУ. Поэтому все твои цветные-расцветные многоугольники уходят не на экран, а в другую область памяти, где происходит анализ положения курсора.


evil_mike   (2008-07-15 21:57:00) [10]

Так я же сначала рисую в цвете..а когда рисуется текстурами - уже неважно, есть там цвет или нет..или я чего-то не понимаю?


Renegat   (2008-07-15 21:49:00) [11]

Я, кажется, начинаю понимать, в чём петрушка! Дело в том, что при отрисовке в буфер выборки, буфер цвета со времени последнего кадра НЕ обновляется - в него просто не рисуется ничего (по Краснову)!


evil_mike   (2008-07-15 21:29:00) [12]

procedure TModel.DrawColoured(RCol, GCol, BCol: byte);
var I:Integer;
begin
 for I:=0 to ObjectCount-1 do
  if Objects[I].Visible then
   Objects[I].DrawColoured(RCol, GCol, BCol);
end;

...
procedure T3DObject.DrawColoured(RCol, GCol, BCol: byte);
var F, iVertex, PointIndex:Integer;
begin
FTransformList.Push;
glPushName(FObjectIndex);
glBegin(FRMode);
for F:=0 to FaceCount-1 do
for iVertex:=0 to 2 do
begin
PointIndex:=Faces[F].VertIndex[iVertex];
glColor3ub (RCol, GCol, BCol);
glVertex3f(Verts[PointIndex].X, Verts[PointIndex].Y, Verts[PointIndex].Z);
end;
 glEnd;
 glPopName;
 FTransformList.Pop;
end;


Renegat   (2008-07-15 21:27:00) [13]

Тогда - код в студию. Ибо то, что творится в недрах самой drawcoloured, сокрыто от моего мысленного взора))


evil_mike   (2008-07-15 21:25:00) [14]

Не помогло..


evil_mike   (2008-07-15 21:19:00) [15]

Если рисовать только цветом, то на канвасе все будет правильно. В этом-то и проблема, я все проверил через поиск - нигде больше лишних вызовов нету..


Renegat   (2008-07-15 21:19:00) [16]

чёрт. пора мне на топчан. всё не успеваю никак =(

Короче, значит в drawне отключается текстурирование. glDisable(GL_TEXTURE_2D) - в начало colouredдолжно помочь.


Renegat   (2008-07-15 21:17:00) [17]

Я не прикалываюсь. Я правда пытаюсь помочь...
А что копируется, если рисование текстурированных примитивов вообще отключить?
Отсюда, возможны 2 варианта:

1) На канвас попадает та картинка, что ожидалась: Значит, в каком-то месте отрисовка "цветом" забивается "текстурной", скажем, незамеченным вызовом где-либо изначального draw, ну мало ли бывает опечаток или недосмотров.

2) На канвас упрямо копируются текстурированные примитивы: Ошибка в самой drawcoloured. Берём отладчик и шерстим на предмет вызовов glEnable(GL_TEXTURE), glTexImage2D() и иже с ними.


evil_mike   (2008-07-15 21:11:00) [18]


> По отдельности они работают отлично.

То есть если я только рисую в цвете и не рисую с текстурами - получается правильный канвас без текстур..


evil_mike   (2008-07-15 21:09:00) [19]

Не, вы все прикалываетесь что ли? Еще раз........

У меня есть девайс контекст. Там я рисую примитивы. Я могу, используя процедуру drawbg(draw : string) отрисовать их ДВУМЯ способами. 1. ТОЛЬКО цветом. В этом случае часть изображения также копируется на канвас битпама. 2. ТОЛЬКО с текстурой, в этом случае на канвас битмапа НИЧЕГО НЕ КОПИРУЕТСЯ.

Далее, в процессе рендера я 1. Отрисовываю примитивы цветом в зависимости от их номера по порядку. Копирую в битмап, откуда они и будут далее браться 2. Отрисовываю примитивы с текстурами, чтоб визуально было красивее.

Проблема : после этих процедур, на канвасе битмапа оказывается не рисунок с примитивами ЦВЕТОМ, а рисунок с ЗАТЕКСТУРИРОВАННЫМИ примитивами. Еще раз повторю, что если примитивы рисуются с текстурами, то канвас битмапа НЕ УЧАСТВУЕТ!

Все, лучше объяснить уже не получится.


Renegat   (2008-07-15 21:05:00) [20]

Проблема может быть, скажем, в том, что либо не втом месте очищается буфер цвета/глубины/вырезки. Или в том, что drawcolouredвоще ничего не отрисовывает. Или в том, что эта процедура работает аналогично drawс текстурами. Так или иначе - нужен код.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо