Всем доброго дня.
Сделал тени(OpenGL) Shadow Map(depth-texture). Но возникла проблема, объекты с прозрачностью отбрасывают свою "геометрическую" тень, а не то, что с прозрачностью.
Рендею объект вот так(и в SM и в сцену):
void RenderAlpa()
{
glDisable(GL_CULL_FACE);
glEnable(GL_ALPHA_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Ent->Render(setka);
glDisable(GL_BLEND);
glDisable(GL_ALPHA_TEST);
glEnable(GL_CULL_FACE);
}Ну тут два вихода: либо не рисовать такие объекты вообще, либо рисовать их еще и в специальную текстуру, в которой будет храниться их прозрачность. Если я тебя правильно понял. Если нет - попробуй glAlphaFunc(GL_GREATER, 0.25)
Хм, просто читал, что в SM нет проблемы с отрисовкой теней от Alpha поверхностей.
рисовать их еще и в специальную текстуру
А если рендерить сцену не в depth, а сохранять глубину сцены шейдером в что-то типа RGBA_8/16?
При рендере в глубину надо включить альфатест... Если хочешь, чтобы прозрачность тени зависела от альфы, то дополнительная текстура (дополнительно хранить с глубиной, если например это RGBA)...
зачем blending ?
Так я рисую модель в depth-texture с уже включенной прозрачностью(как и в сцену).
прозрачность тени зависела от альфы
Если говорить просто, то мне нужны дырки в тени :). А под зависела от альфы, имеется ввиду, что "яркость дырок" зависит от значения в alpha канале текстуры? Если да, то такого не требуется(во всяком случае пока).
-----------------------------
Переписал так:
void RenderAlpha()
{
glDisable(GL_CULL_FACE);
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.5);
Ent->Render(setka);
glDisable(GL_ALPHA_TEST);
glEnable(GL_CULL_FACE);
}Вообщем, на сетке вылезли какие-то пятна(ползают вместе с вращением камеры), а на заднем фоне видна тень от "коробки"(а хочется сетку)
BenTech
выведи shadowMap отдельно на экран, ортопроекция
А как вытащить из Depth текстуры картинку? А то белый квадрат рисуется.
BenTech
> А как вытащить из Depth текстуры картинку? А то белый квадрат рисуется.
переключи в luminance
или шейдером
BenTech
> Если говорить просто, то мне нужны дырки в тени :). А под зависела от альфы,
> имеется ввиду, что "яркость дырок" зависит от значения в alpha канале текстуры?
> Если да, то такого не требуется(во всяком случае пока).
Алтернативно можно заюзать Discard
PS: Хотя у меня в OpenGL discard жёстко артефачит, ATI Radeon HD 5770 (Catalyst 10.3, OpenGL Version 6.14), Vista SP2 (Platform Updated to support DirectX11
МЫЛО
> Хотя у меня в OpenGL discard жёстко артефачит,
а конкретно ?
glGenTextures(1, &texDepth2); glBindTexture(GL_TEXTURE_2D, texDepth2); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE_ARB, GL_LUMINANCE);
Вместо белого стало еле заметное серое мерцание.
А шейдером как?
BenTech
> серое мерцание.
серое - это глубина, а мерцание - это баг :)
шейдером - вынимешь значение из depthTexture, перекодируешь в rgba и рисуешь, ну сделай для глубины pow( depth, 4 ) ещё
innuendo
> а конкретно ?
разными цветами рендер "прёт" в тех местах, где отрисовка должна быть отменена
на дрова пока грешу
BenTech
> А шейдером как?
в шейдере записи глубины
if(texture.a < ALPHATEST_FACTOR)
discard;МЫЛО
> > а конкретно ?
> разными цветами рендер "прёт" в тех местах, где отрисовка должна быть отменена
проверим
Тема в архиве.