-
Доброе время суток. Недавно начал изучать OGL, делаю простенкую программку www.roganovg.narod.ru/stars.zip
По идее все "звезды" должны быть полупрозрачные точнее "пушистые" загружаю текстуры с учетом альфы, разрешаю бленд, но все равно некоторые "звезды" перекрывают друг друга. Что я делаю не так?
-
что-то типа этого
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
-
Дык так и стоит в моем исходнике
-
Сортировку по расстоянию сделай.
и учи матчасть(как работает Depth(Z) buffer)
-
Где б ее взять, матчасть!? Книгу Краснова читаю по 3-му разу ;) Очень много в гуглях но в основном на с++.
За совет про сортировку пасиб, попробую.
Кстати такая мысля зарождалась. )
-
ах да забыл.
если есть только звёзды - можно отключить Z buffer
-
Для звезд лучше подойдет суммирующее смешивание:
glBlendFunc(GL_ONE, GL_ONE);
К тому же, при суммирующем смешивании можно обойтись без сортировки.
-
Да даже если не только звкзды...
можно с выключенным тестом глубины рендерить звезды, а потому уже с тестом все остальное.
> [4] RGV © (10.10.09 05:23)
При чем тут С++? Я про логику работы GPU, а не про язык программирования.
-
-
-
> @!!ex © (10.10.09 14:25) [7]
ты писал
> @!!ex © (09.10.09 18:11) [3]
> Сортировку по расстоянию сделай.
> и учи матчасть(как работает Depth(Z) buffer)
я ответил
> Где б ее взять, матчасть!? Книгу Краснова читаю по 3-му
> разу ;) Очень много в гуглях но в основном на с++....
Вопрос? что такое матчасть? Я так понял это что то вроде ликбеза, вот я и сказал что очень много инфы по огл но в основном на си
-
Всем большое спасибо за советы
> main © (10.10.09 14:23) [6]
glBlendFunc(GL_ONE, GL_ONE); проблемы не решил, но зато приятный эффект наблюдается.
Видно без сортировки не решить проблему. Интересно, а какой лучше алгоритм сортировки придумать ? Чтобы менее "болезненно" для проца было
-
а так пробовал?
glDisable(GL_DEPTH_TEST);
-
Ну так и сделал + сортировка
-
а зачем сортировка то? :)
-
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
и
glDisable(GL_DEPTH_TEST);
всё должно работать
-
> Видно без сортировки не решить проблему. Интересно, а какой
> лучше алгоритм сортировки придумать ? Чтобы менее "болезненно"
> для проца было
Ты видимо ссылку из 9 поста не смотрел, а если смотрел, то видимо не понял. Если тебя устраивает смешивание суммирующее, то там как раз и написано как обойтись без сортировки.
-
> [9] main © (10.10.09 21:02)
> Я недавно тут в спор ввязался по поводу суммирующего смешивания:
Тебе тоже учить матчасть, если думаешь что тип смешивания может помочь при включенном тесте глубины и неверной сортировке.
> [10] RGV © (11.10.09 03:44)
Матчасть - это принципы работы алгоритмов.
OpenGL - это чисто API. API работает с видеокартой. Вот и разберись как работает видеокарта. Как работает тест глубины в данном случае.
-
> @!!ex © (12.10.09 10:20) [17]
Большой кайлём. А то я не пойму о чем речь то :))
з.ы. кайлём это у нас тут на севере коряки так спасибо говорят )
-
> Тебе тоже учить матчасть, если думаешь что тип смешивания
> может помочь при включенном тесте глубины и неверной сортировке.
>
Я думаю ты сам не понимаешь что говоришь, там же все разжевано, и все элементарно делается.
Какая еще "неверная сортировка", ты о чем? При суммирующем смешивании сортировка вообще не нужна. (именно при суммирующем, и только присуммирующем)
Делай по пунктам слово в слово как автор в той заметке написал, и все у тебя получится, и картинка будет правильной.
А если вдруг тебе еще и приспичило, и ты еще хочешь чтобы и в depth-буффере были все значения, то потом просто нарисуй все полупрозрачные звезды(для которых отключал запись в depth-буффер) без записи в color-буфер, но с записью в depth-буффер, и с включенным тестом глубины. ( !! и все это без сортировки !! )
-
> Большой кайлём.
Не слушай его! А то он тебя научит, да!! )))
-
> main ©
Разжевываю:
При ЛЮБОЙ сортировке Depth Test идет первым.
Тоесть если тест глубины НЕ сработал, то пиксель не рисуется.
Теперь имеем два квада звезд.
Первая находится ближе к камере и частично перекрывает вторую.
Первая нарисовалась, часть второй НЕ ПРОЙДЕТ тест глубины, адже там, где у первой звезды пиксели прозрачны.
Тоесть часть второй звезды ВООБЩЕ НЕ НАРИСУЕТСЯ, ПРИ ЛЮБОМ СМЕШИВАНИИ.
-
> @!!ex © (12.10.09 13:25) [21]
Вопрос:
Ты ссылку что я привел, читал?
-
> [22] main © (12.10.09 13:27)
Читал.
Ключевой момент статьи:
при отрисовке прозрачных объектов, выключать для них запись в буффер глубины, но оставлять включенным тест на глубину (Z-test).
О чем я тебе и талдычу уже 4 поста. Внимательно прочитай нашу с тобой переписку.
-
Разжевываю:
- сначала рисуем ВСЕ непрзорачные объекты;
- при отрисовке прозрачных объектов, выключаем для них запись в буффер глубины, но оставляем включенным тест на глубину (Z-test).
Этот метод всегда работает правильно, если тип блендинга (прозрачности) задан как суммирование (GL_ONE, GL_ONE) так как от перемены мест слагаемых, сумма не меняется.
При использовании других типов прозрачности, будут артефакты.
!! и все это без сортировки!!
-
> [24] main © (12.10.09 13:33)
Мля....
Ключевой момент "ВЫКЛЮЧЕННЫЙ DEPTH TEST". О чем я и CryptoGen и говорили. А ты о каком-то смешивании пишешь, которое никак проблему не решает.
Ты ехешку смотрел??? Там близко нет проблемы смешивания. Там проблема буффера глубины.
-
> @!!ex © (12.10.09 13:36) [25]
А я вам толдычу о том:
1) Для звезд лучше подойдет суммирующее смешивание, чем обычное. Потому-что для звезд такое смешивание красивее.))
2) И плюс ко всему, именно такой тип смешивание, решает проблему сортировки.
-
> Ты ехешку смотрел???
Сейчас вот неполенился посмотрел.
Если совсем просто, так там добавить нужно то всего пару строчек:
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;
-
Вот выделил жирным шрифтом:
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;
-
Ну как, красиво? ))
Артефакты есть? Нет!
-
Ну вы еще подеритесь :))
Вот мои первые шаги в опенгл
www.roganovg.narod.ru/stars.zip
-
кстати
у меня сложилось впечатление, что вы говорите об одном и том же :)))
-
Я говорю о том, что не надо решать проблему которой на самом деле нет.
Зачем думать как сортировать, если в данном конкретном примере можно не сортировать.
Алекс, ты уже выпил яду?
))
-
> [32] main © (12.10.09 14:52)
Даже не надейся. :)
Я лишь на протяжении 6 постов говорил о том, что смешивание НЕ будет работать с включенным DepthTest'ом.
Что ты и продемонстрировал в [28]
Убери строку:
glDepthMask( False );
и получишь баги. Если что, эта строка отключает запись в глубину. Что в данном случае равносильно полномю отключению теста глубины.