Конференция "Media" » BitBlt - где косяк? [D7, WinXP]
 
  • evil_mike (15.07.08 14:25) [0]
    Доброго времени суток.
    У меня следующий вопрос.

    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 (15.07.08 14:26) [1]
    Упс, виноват. Там ifBitBlt(colormap.Canvas.Handle... Не скопировалось почему-то.
  • {RASkov} © (15.07.08 19:24) [2]
    > [0] evil_mike   (15.07.08 14:25)

    > , SRCCOPY

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

    Потому что потом с текстурой.

    Давай соберись и "спроси вопрос" :)
    А если решаешься код(кусок) показывать, то показывай весь(кусок), а не в торопях набранный тут на форуме...
  • evil_mike (15.07.08 20:13) [3]
    {RASkov}
    Не понимаю..в основном цикле у меня идет
    drawbg('color');
    drawbg('tex');
    А колормап заполнятеся ТОЛЬКО в drawbg('color'); , так каким образом он может потом снова перерисоваться?
  • Омлет (15.07.08 20:47) [4]
    А какой смысл в сравнении BitBlt c true?
    Он просто возвращает ненулевое значение при успешной отрисовке. А я еще не видел случая, чтобы отрисовка бала не успешной ))

    И в том месте, где у тебя > if draw='tex' then > там нет BitBlt. Может поэтому для tex не отрисовывается?)
  • Омлет (15.07.08 20:48) [5]
    Вообще, конечно, я ничерта не понял ни в коде, ни в задаче )
  • evil_mike (15.07.08 20:55) [6]
    Опишу без кода. Есть два варианта отрисовки. Первая - с текстурами в текущем контексте. Вторая - цветом (без текстур) в текущем контексте + она копируется на канвас битмапа. Так вот, если в основном цикле я сначала рисую в цвете, а потом с текестурами - то на канвасе оказывается картинка с текстурами. Вопрос: как это может быть, если отрисовка с текстурами и БитБлт вообще нигде не связаны?
  • Renegat (15.07.08 20:59) [7]
    > [0] evil_mike   (15.07.08 14:25)
    > [3] evil_mike   (15.07.08 20:13)

    Мммда. Судя по п0стам, трава была что надо %)
    Попробую включить телепатор:

    итак, ты воспроизводишь на некоем DC 3D-графику. С помощью OpenGL. А потом куда-то коприуешь нарисованное в зависимости от положения курсора. Вопрос - куда и зачем? Озвучь задачу.

    ++ по сабжу:
    > Но если я сначала рисую в цвете, а потом с текстурой - в
    > colormap оказывается изображение с текстурой..кто в курсе,
    > почему так?

    Именно потому что ты сначала рисуешь некий многоугольник цветом, а потом на этом же месте перерисовываешь его же, но только текстурированным. Вот он у тебя и затирает то что было нарисовано ранее.

    пшшш..... всё, телепатор сгорел =)
  • Renegat (15.07.08 21:03) [8]
    упс, опоздал. Что ж, при такой постановке вопроса картина меняется. Очевидно, что проблема - не в коде, что ты привёл. (И, кстати, было бы неплохо передавать параметр не строкой, а числом - так намного быстрее, плюс к тому проверка на верный вызов BitBLT не нужна совсем - так или иначе будет выполнен выход из процедуры)
  • Renegat (15.07.08 21:05) [9]
    Проблема может быть, скажем, в том, что либо не втом месте очищается буфер цвета/глубины/вырезки. Или в том, что drawcoloured воще ничего не отрисовывает. Или в том, что эта процедура работает аналогично draw с текстурами. Так или иначе - нужен код.
  • evil_mike (15.07.08 21:09) [10]
    Не, вы все прикалываетесь что ли? Еще раз........

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

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

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

    Все, лучше объяснить уже не получится.
  • evil_mike (15.07.08 21:11) [11]

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

    То есть если я только рисую в цвете и не рисую с текстурами - получается правильный канвас без текстур..
  • Renegat (15.07.08 21:17) [12]
    Я не прикалываюсь. Я правда пытаюсь помочь...
    А что копируется, если рисование текстурированных примитивов вообще отключить?
    Отсюда, возможны 2 варианта:

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

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

    Короче, значит в draw не отключается текстурирование. glDisable(GL_TEXTURE_2D) - в начало coloured должно помочь.
  • evil_mike (15.07.08 21:19) [14]
    Если рисовать только цветом, то на канвасе все будет правильно. В этом-то и проблема, я все проверил через поиск - нигде больше лишних вызовов нету..
  • evil_mike (15.07.08 21:25) [15]
    Не помогло..
  • Renegat (15.07.08 21:27) [16]
    Тогда - код в студию. Ибо то, что творится в недрах самой drawcoloured, сокрыто от моего мысленного взора))
  • evil_mike (15.07.08 21:29) [17]
    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 (15.07.08 21:49) [18]
    Я, кажется, начинаю понимать, в чём петрушка! Дело в том, что при отрисовке в буфер выборки, буфер цвета со времени последнего кадра НЕ обновляется - в него просто не рисуется ничего (по Краснову)!
  • evil_mike (15.07.08 21:57) [19]
    Так я же сначала рисую в цвете..а когда рисуется текстурами - уже неважно, есть там цвет или нет..или я чего-то не понимаю?
  • Renegat (15.07.08 22:04) [20]
    Ты, я так понимаю, юзаешь выборку средствами OpenGL. А там, когда переключаются буферы - с GL_RENDER на GL_SELECT - отрисовки в GL_RENDER тупо НЕТУ. Поэтому все твои цветные-расцветные многоугольники уходят не на экран, а в другую область памяти, где происходит анализ положения курсора.
  • evil_mike (15.07.08 22:06) [21]

    > GL_RENDER на GL_SELECT

    У меня таких вообще нету..
  • Renegat (15.07.08 22:19) [22]
    Ну а зачем же тогда glPushName? Видимо, где-то в коде завуалировано. Может, этот код был получен методом копи-паста?
  • evil_mike (15.07.08 22:21) [23]
    ? Потому что в одной модели несколько объектов.
  • Renegat (15.07.08 22:24) [24]
    > [23] evil_mike   (15.07.08 22:21)

    оно понятно. Эначит, так или иначе ты используешь выборку, так?
  • evil_mike (15.07.08 22:27) [25]
    Сейчас нет.
  • Renegat (15.07.08 22:32) [26]
    Тогда я воще не понимаю. А код целиком, надеюсь, не особо секретен? Если это так, выложи куда-нить на файлообменник. Протрассировать его надо. В отладчике. И при каждом вызове какой-то функции мониторить изменение флагов состояния ОГЛ.
  • evil_mike (15.07.08 22:42) [27]
    Хм..если все так серьезно, наверно проще отказаться от использования битблт..кроме него-то все нормально работает ) Спасибо за помощь
  • evil_mike (21.07.08 13:42) [28]
    Если кому-то пригодится, я проблему решил запихнув glfinish(); после отрисовки цветом. На каком-то англоязычном форуме нашел что-то типа того что опенгл отдает управление окну после того как все сам отрисует, поэтому битблт и работает только после всех процедур опенгл..а глфиниш насильно заставляет его передать управление окну.
 
Конференция "Media" » BitBlt - где косяк? [D7, WinXP]
Есть новые Нет новых   [134431   +11][b:0][p:0.001]