-
Здравствуйте, вот диплом нужно написать и столкнулся с проблемой в отрисовке объектов. В общем есть несколько объектов, рисуются с помощю 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]Посоветую сортировку плоскостей по расстоянию.
Свежие видеокарты умеют сами подобные ситуации разруливать... но ей богу сортировка проще. -
хм... а что именно значит сортировка по расстоянию?
-
@!!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)
Как поможет?