Конференция "Игры" » OpenGL, blend [Delphi, Windows]
 
  • RGV © (09.10.09 14:52) [0]
    Доброе время суток. Недавно начал изучать OGL, делаю простенкую программку www.roganovg.narod.ru/stars.zip
    По идее все "звезды" должны быть полупрозрачные точнее "пушистые"  загружаю текстуры с учетом альфы, разрешаю бленд, но все равно некоторые "звезды" перекрывают друг друга. Что я делаю не так?
  • CrytoGen (09.10.09 15:14) [1]
    что-то типа этого
    glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
  • RGV © (09.10.09 16:17) [2]
    Дык так и стоит в моем исходнике
  • @!!ex © (09.10.09 18:11) [3]
    Сортировку по расстоянию сделай.
    и учи матчасть(как работает Depth(Z) buffer)
  • RGV © (10.10.09 05:23) [4]
    Где б ее взять, матчасть!? Книгу Краснова читаю по 3-му разу ;) Очень много в гуглях но в основном на с++.
    За совет про сортировку пасиб, попробую.
    Кстати такая мысля зарождалась. )
  • CrytoGen (10.10.09 06:47) [5]
    ах да забыл.
    если есть только звёзды - можно отключить Z buffer
  • main © (10.10.09 14:23) [6]
    Для звезд лучше подойдет суммирующее смешивание:
    glBlendFunc(GL_ONE, GL_ONE);
    К тому же, при суммирующем смешивании можно обойтись без сортировки.
  • @!!ex © (10.10.09 14:25) [7]
    Да даже если не только звкзды...
    можно с выключенным тестом глубины рендерить звезды, а потому уже с тестом все остальное.


    > [4] RGV ©   (10.10.09 05:23)

    При чем тут С++? Я про логику работы GPU, а не про язык программирования.
  • @!!ex © (10.10.09 14:28) [8]
    http://cgm.computergraphics.ru/issues/issue16/3dbooks_review
    Также рекомендую прочитать первый каммент.

    > К тому же, при суммирующем смешивании можно обойтись без
    > сортировки.

    ПРи включенном Delth Test'e? Ну-ну. :))
  • main © (10.10.09 21:02) [9]

    > ПРи включенном Delth Test'e? Ну-ну. :))


    Я недавно тут в спор ввязался по поводу суммирующего смешивания:
    http://www.gamedev.ru/code/tip/?id=3679

    ))
  • RGV © (11.10.09 03:44) [10]

    > @!!ex ©   (10.10.09 14:25) [7]

    ты писал

    > @!!ex ©   (09.10.09 18:11) [3]
    > Сортировку по расстоянию сделай.
    > и учи матчасть(как работает Depth(Z) buffer)

    я ответил

    > Где б ее взять, матчасть!? Книгу Краснова читаю по 3-му
    > разу ;) Очень много в гуглях но в основном на с++....

    Вопрос? что такое матчасть? Я так понял это что то вроде ликбеза, вот я и сказал что очень много инфы по огл но в основном на си
  • RGV © (11.10.09 03:53) [11]
    Всем большое спасибо за советы

    > main ©   (10.10.09 14:23) [6]

    glBlendFunc(GL_ONE, GL_ONE); проблемы не решил, но зато приятный эффект наблюдается.

    Видно без сортировки не решить проблему. Интересно, а какой лучше алгоритм сортировки придумать ? Чтобы менее "болезненно" для проца было
  • CrytoGen (11.10.09 07:44) [12]
    а так пробовал?
        glDisable(GL_DEPTH_TEST);
  • RGV © (11.10.09 08:20) [13]
    Ну так и сделал + сортировка
  • CrytoGen (11.10.09 08:27) [14]
    а зачем сортировка то? :)
  • CrytoGen (11.10.09 08:28) [15]
    glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
    и
    glDisable(GL_DEPTH_TEST);

    всё должно работать
  • main © (11.10.09 11:49) [16]

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


    Ты видимо ссылку из 9 поста не смотрел, а если смотрел, то видимо не понял. Если тебя устраивает смешивание суммирующее, то там как раз и написано как обойтись без сортировки.
  • @!!ex © (12.10.09 10:20) [17]
    > [9] main ©   (10.10.09 21:02)
    > Я недавно тут в спор ввязался по поводу суммирующего смешивания:

    Тебе тоже учить матчасть, если думаешь что тип  смешивания может помочь при включенном тесте глубины и неверной сортировке.


    > [10] RGV ©   (11.10.09 03:44)

    Матчасть - это принципы работы алгоритмов.
    OpenGL - это чисто API. API работает с видеокартой. Вот и разберись как работает видеокарта. Как работает тест глубины в данном случае.
  • RGV © (12.10.09 12:42) [18]

    > @!!ex ©   (12.10.09 10:20) [17]

    Большой кайлём. А то я не пойму о чем речь то :))
    з.ы. кайлём это у нас тут на севере коряки так спасибо говорят )
  • main © (12.10.09 13:19) [19]

    > Тебе тоже учить матчасть, если думаешь что тип  смешивания
    > может помочь при включенном тесте глубины и неверной сортировке.
    >


    Я думаю ты сам не понимаешь что говоришь, там же все разжевано, и все элементарно делается.

    Какая еще "неверная сортировка", ты о чем? При суммирующем смешивании сортировка вообще не нужна. (именно при суммирующем, и только присуммирующем)

    Делай по пунктам слово в слово как автор в той заметке написал, и все у тебя получится, и картинка будет правильной.

    А если вдруг тебе еще и приспичило, и ты еще хочешь чтобы и в depth-буффере были все значения, то потом просто нарисуй все полупрозрачные звезды(для которых отключал запись в depth-буффер) без записи в color-буфер, но с записью в depth-буффер, и с включенным тестом глубины. ( !! и все это без сортировки !! )
  • main © (12.10.09 13:23) [20]

    > Большой кайлём.


    Не слушай его! А то он тебя научит, да!!  )))
  • @!!ex © (12.10.09 13:25) [21]
    > main ©

    Разжевываю:
    При ЛЮБОЙ сортировке Depth Test идет первым.
    Тоесть если тест глубины НЕ сработал, то пиксель не рисуется.
    Теперь имеем два квада звезд.
    Первая находится ближе к камере и частично перекрывает вторую.
    Первая нарисовалась, часть второй НЕ ПРОЙДЕТ тест глубины, адже там, где у первой звезды пиксели прозрачны.
    Тоесть часть второй звезды ВООБЩЕ НЕ НАРИСУЕТСЯ, ПРИ ЛЮБОМ СМЕШИВАНИИ.
  • main © (12.10.09 13:27) [22]

    > @!!ex ©   (12.10.09 13:25) [21]


    Вопрос:
    Ты ссылку что я привел, читал?
  • @!!ex © (12.10.09 13:28) [23]
    > [22] main ©   (12.10.09 13:27)

    Читал.
    Ключевой момент статьи:
    при отрисовке прозрачных объектов, выключать для них запись в буффер глубины, но оставлять включенным тест на глубину (Z-test).



    О чем я тебе и талдычу уже 4 поста. Внимательно прочитай нашу с тобой переписку.
  • main © (12.10.09 13:33) [24]
    Разжевываю:

    - сначала рисуем ВСЕ непрзорачные объекты;
    - при отрисовке прозрачных объектов, выключаем для них запись в буффер глубины, но оставляем включенным тест на глубину (Z-test).

    Этот метод всегда работает правильно, если тип блендинга (прозрачности) задан как суммирование (GL_ONE, GL_ONE) так как от перемены мест слагаемых, сумма не меняется.

    При использовании других типов прозрачности, будут артефакты.

    !! и все это без сортировки!!
  • @!!ex © (12.10.09 13:36) [25]
    > [24] main ©   (12.10.09 13:33)

    Мля....
    Ключевой момент "ВЫКЛЮЧЕННЫЙ DEPTH TEST". О чем я и CryptoGen и говорили. А ты о каком-то смешивании пишешь, которое никак проблему не решает.
    Ты ехешку смотрел??? Там близко нет проблемы смешивания. Там проблема буффера глубины.
  • main © (12.10.09 13:49) [26]

    > @!!ex ©   (12.10.09 13:36) [25]


    А я вам толдычу о том:
    1) Для звезд лучше подойдет суммирующее смешивание, чем обычное. Потому-что для звезд такое смешивание красивее.))
    2) И плюс ко всему, именно такой тип смешивание, решает проблему сортировки.
  • main © (12.10.09 13:58) [27]

    > Ты ехешку смотрел???


    Сейчас вот неполенился посмотрел.
    Если совсем просто, так там добавить нужно то всего пару строчек:

    Procedure TForm1.Draw;
    var
     n:integer;
    begin
     glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
     glLoadIdentity;
     glTranslatef(0, 0, -35);//camera
     //Stars
     glColor3F(1,1,1);
     glEnable(GL_POINT_SPRITE_ARB);

     glEnable( GL_BLEND );
     glBlendFunc( GL_ONE , GL_ONE );
     glDepthMask( False );

     glbegin(GL_POINTS);
       for n:=1 to MaxStars do
         glVertex3f(Stars[n].pos.x,Stars[n].pos.y,Stars[n].pos.z);
     glEnd;
     glDisable(GL_POINT_SPRITE_ARB);
     SwapBuffers(DC);
    end;
  • main © (12.10.09 14:04) [28]
    Вот выделил жирным шрифтом:

    Procedure TForm1.Draw;
    var
    n:integer;
    begin
    glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
    glLoadIdentity;
    glTranslatef(0, 0, -35);//camera
    //Stars
    glColor3F(1,1,1);
    glEnable(GL_POINT_SPRITE_ARB);

    glEnable( GL_BLEND );
    glBlendFunc( GL_ONE , GL_ONE );
    glDepthMask( False );


    glbegin(GL_POINTS);
      for n:=1 to MaxStars do
        glVertex3f(Stars[n].pos.x,Stars[n].pos.y,Stars[n].pos.z);
    glEnd;
    glDisable(GL_POINT_SPRITE_ARB);
    SwapBuffers(DC);
    end;
  • main © (12.10.09 14:06) [29]
    Ну как, красиво? ))
    Артефакты есть? Нет!
  • RGV © (12.10.09 14:24) [30]
    Ну вы еще подеритесь :))
    Вот мои первые шаги в опенгл
    www.roganovg.narod.ru/stars.zip
  • RGV © (12.10.09 14:36) [31]
    кстати
    у меня сложилось впечатление, что вы говорите об одном и том же :)))
  • main © (12.10.09 14:52) [32]
    Я говорю о том, что не надо решать проблему которой на самом деле нет.
    Зачем думать как сортировать, если в данном конкретном примере можно не сортировать.

    Алекс, ты уже выпил яду?
    ))
  • @!!ex © (12.10.09 15:23) [33]
    > [32] main ©   (12.10.09 14:52)

    Даже не надейся. :)
    Я лишь на протяжении 6 постов говорил о том, что смешивание НЕ будет работать с включенным DepthTest'ом.
    Что ты и продемонстрировал в [28]
    Убери строку:
    glDepthMask( False );

    и получишь баги. Если что, эта строка отключает запись в глубину. Что в данном случае равносильно полномю отключению теста глубины.
 
Конференция "Игры" » OpenGL, blend [Delphi, Windows]
Есть новые Нет новых   [134428   +41][b:0][p:0.001]