Конференция "Игры" » Проблема при использовании прозрачности объектов в OpenGL [Delphi, Windows]
 
  • Gwaeron © (22.04.10 14:53) [0]
    Здравствуйте, вот диплом нужно написать и столкнулся с проблемой в отрисовке объектов. В общем есть несколько объектов, рисуются с помощю OpenGL. Все объекты это поверхности второго порядка, либо просто плоскости. Рисуются просто 4-угольниками с помощью glBegin(GL_QUADS), далее SwapBuffers(DC). Есть потребность в изменении прозрачности объектов. Возникает проблема, когда допустим нарисованны две плоскости, то смотря на первую через вторую, первая видна, а наоборот нет. По большому счету смотря через объект нарисованный первым все остальные объекты, нарисованные позже, не видны. Посоветуйте что-либо.
    Вот две картинки, что бы было понятней.
    [URL=http://radikal.ru/F/i052.radikal.ru/1004/79/43c04a13675e.jpg.html][IMG]http://i052.radikal.ru/1004/79/43c04a13675et.jpg[/IMG][/URL]
    [URL=http://radikal.ru/F/s59.radikal.ru/i165/1004/e3/9314f63837a0.jpg.html][IMG]http://s59.radikal.ru/i165/1004/e3/9314f63837a0t.jpg[/IMG][/URL]
    Так же немного кода:
    [CODE]procedure PlosX(r1,r2,r3:GLFloat);
    ...
    Begin
    glBegin(GL_QUADS);
    ...
    if i:=-d to d-1 then
    begin
     y1:=...;
     y2:=...;

     z1:=...;
     z2:=...;

     x1:=...;
     x2:=...;
     x3:=...;
     x4:=...;

     glVertex3f( x1, y1, z1);
     glVertex3f( x4, y2, z1);
     glVertex3f( x2, y2, z2);
     glVertex3f( x3, y1, z2);

    end;
    glEnd;
    End;[/CODE]

    И в итоге получается:
    [CODE]glColor4f(1,0,0,Blend1);
    PlosX(a1,b1,c1);
    glColor4f(0,1,0,Blend2);
    PlosX(a2,b2,c2);
    SwapBuffers(DC);[/CODE]
    Ну там перед этим инициализация графики, цвета, глубины и т.д., но она вроде стандартная, но все же:
    [CODE]  glMatrixMode(GL_PROJECTION);
     glLoadIdentity;
     gluPerspective(45.0, PanelGraph.Width/PanelGraph.Height, 0.1, 500);
     glMatrixMode(GL_MODELVIEW);
     glLoadIdentity;
     glClearColor(BackC.R, BackC.G, BackC.B, 1.0);
     glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
     glShadeModel(GL_SMOOTH);                
     glClearDepth(1.0);                      
     glEnable(GL_DEPTH_TEST);                
     glDepthFunc(GL_LESS);                  
     glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

     glEnable(GL_COLOR_MATERIAL);
     glLightModelfv(GL_LIGHT_MODEL_AMBIENT, @ambient);
     glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, @ambient);
     glEnable(GL_LIGHTING);
     glEnable(GL_LIGHT0);

     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
     glEnable(GL_BLEND);
     glEnable(GL_LINE_SMOOTH);
     glEnable(GL_POINT_SMOOTH);[/CODE]
  • @!!ex © (22.04.10 20:34) [1]
    Посоветую сортировку плоскостей по расстоянию.
    Свежие видеокарты умеют сами подобные ситуации разруливать... но ей богу сортировка проще.
  • Gwaeron © (23.04.10 17:30) [2]
    хм... а что именно значит сортировка по расстоянию?
  • @!!ex © (24.04.10 19:52) [3]
    > [2] Gwaeron ©   (23.04.10 17:30)

    Полупрозрачные плоскости должны рисоваться от дальней к ближней.
    В некоторых ситуациях имеет смысл отключить тест глубины.

    Универсального простого решения всегда дающего хороший результат - нет.

    Сортировка работает хорошо, кроме тех случаев, когда полупрозрачные плоскости пересекаются.
  • V@s_!s_D@s © (03.05.10 10:49) [4]
    У меня ещё идея :
    создай массив в которвй по порядку вноси все встреченые плоскости перечислением.
    потом перечисли их в правильном порядке

    @!!ex ©   (24.04.10 19:52) [3]
    > [2] Gwaeron ©   (23.04.10 17:30)

    Полупрозрачные плоскости должны рисоваться от дальней к ближней.
    В некоторых ситуациях имеет смысл отключить тест глубины.

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

    Думаю что возможно есть резон проверить порядок отрисовки вершин. Ведь правильное рисование против часовой стрелки - всё что нарисовано по часовой - зад. Хотя я тут точно не помню провель командой
    glEnable (GL_CULL_FACE);
    Команда glcullFace позволяет задавать, какие стороны при этом подвергаются отсечению, передние или задние. Понятно, что по умолчанию предлагается отсекать задние стороны. Противоположное правило
    отсечения можно установить так:
    glCullFace (GL_FRONT);

    Ну чё то как то так
  • @!!ex © (03.05.10 11:14) [5]
    > [4] V@s_!s_D@s ©   (03.05.10 10:49)
    > Тут кстати не уверен - я в своей програме рисовал полупрозрачнные
    > плоскости но с такой проблемой не сталкивался.

    А я - уверен.

    CULL FACE спасает при рисовании замкнутых полупрозрачных объектов, которые в принципе не видны изнутри. Сделай 3D стакан и попробуй CULL FACE ом решить пробелму полупрозрачности. ;)
  • V@s_!s_D@s © (08.05.10 17:10) [6]
    Углубился в чтенние и подумал( хотя лень было прикидывать код), что трафарет подойдет идеально.
  • @!!ex © (08.05.10 17:12) [7]
    для чего подойдет?
  • @!!ex © (08.05.10 17:12) [8]
    Для работы с полупрозрачными объектами??
    Как его там использовать??
  • V@s_!s_D@s © (08.05.10 17:39) [9]

    > Сортировка работает хорошо, кроме тех случаев, когда полупрозрачные
    > плоскости пересекаются.


    Сдесь
  • @!!ex © (08.05.10 17:46) [10]
    > [9] V@s_!s_D@s ©   (08.05.10 17:39)

    Как поможет?
 
Конференция "Игры" » Проблема при использовании прозрачности объектов в OpenGL [Delphi, Windows]
Есть новые Нет новых   [134427   +37][b:0][p:0]