Пытаюсь по этой статье сделать на ОпенГЛе ССАО... Юзаю рендерманки...
Собственно делаю вот что:
1) рендерю чайник, в текстуру "tex_color" сохраняется цвет
2) рендерю чайник, в текстуру "tex_normal" сохраняется нормаль
3) рендерю чайник, в текстуру "tex_position" сохраняется позиция
4) рендерю квад на весь экран, использую нормаль и позицию, сохраняю результат в текстуру "tex_ssao"
5) рендерю квад на весь экран, использую ссао и цвет, результат виден на экране (должен быть :))
Вообщемто вроде всё просто, но на шаге 4 просто чёрный экран (на 5 шаге темболее чёрный экран)... Что не так? Ктонить пробывал по этой статье делать?
Строчку
float3 centerNormal = Normal_tex.Sample( Linear_Sampler, newUV ).xyz;
на ГЛСЛ перевёл как
vec3 centerNormal = texture2D(tex_normal, newUV).xyz;
правильно?
З.Ы. Могу выложить рендерманковский rfx файлик...
Executor
newUV небось как int ? :)
innuendo
Нет... newUV везде флоат...
vec2 newUV = texCoord + (TexelSizeX / 2.0) + (TexelSizeY / 2.0);
int в цикле есть:
for (int x = -5; x < 6; x++) { for (int y = -5; y < 6; y++) { vec2 MoveUV = vec2(TexelSizeX * float(x), TexelSizeY * float(y)); // Тута!!! vec2 sampleUV = newUV + MoveUV; vec3 samplePos = texture2D(tex_position, sampleUV).xyz; vec3 toCenter = samplePos - centerPos; float Distance = length(toCenter); toCenter = toCenter / Distance; float centerContrib = saturate((dot(toCenter, centerNormal) - AOMinimumCrease) * SSAO_Bias); float rangeAttenuation = 1.0 - saturate(Distance); color += centerContrib * rangeAttenuation; } }
Это может быть причиной? Заменил цикл на флоат, ничего не изменилось...
Executor
float3 centerNormal = Normal_tex.Sample( Linear_Sampler, newUV ).xyz;
это выборка из TBO в DX ?
innuendo
>float3 centerNormal = Normal_tex.Sample( Linear_Sampler, newUV ).xyz;
>это выборка из TBO в DX ?
Это в шейдере ДХ, из чего это выборка я без понятия, видимо обычная выборка с текстуры, я ДХ незнаю...
Executor
похоже это выборка из TBO
тогда newUV - это int координата в линейном буффере
innuendo
>похоже это выборка из TBO
>тогда newUV - это int координата в линейном буффере
Если буффер линейный, то он как минимум тогда будет float, а не float2...
Executor
>>float3 centerNormal = Normal_tex.Sample( Linear_Sampler, newUV ).xyz;
какой тип у newUV ?
скаляр или вектор?
innuendo
>какой тип у newUV ?
>скаляр или вектор?
Я же в посте 2 написал какой...
vec2 newUV = texCoord + (TexelSizeX / 2.0) + (TexelSizeY / 2.0);
vec2 == float2
Executor
Извини, перепутал с Load :)
как них в DX всё запущено :)
Executor + All
Извеняюсь что вклинивюсь, просто совсем недавно пробовал сделать прилисный ССАО и у меня так ничего и не вышло. Возможно потому, что пытался вложиться во 2-е шейдеры, а может и по корявости рук.
В общем у меня вопрос такой по какому из алгоритмов лучше расчитывать затенения? Текстуру цвета, глубины и нормалей получил дано, а вот затенить это дело прилично так и ре смог :(
Breezy
Сам бы хотел знать... :) Эта статья единственное место где более менее понятно написано чо делать надо, хотя ничо и не работает... :)
Executor
Я пробовал следующие варианты, возможно они мне показались кривыми изза малого числа выборок у шейдера(юзаю 2-е)
1. Српавнение глубины без нормалей, в общем вариант кривой, работает только на мелкие обекты.
2. Сравнение глубин на основе нормалей, идейно должен пахать лучше, на практике ужасен.
3. Выборка и блюр в зависимости от глубины... к сожалению не оправдал моих ожиданий...
хотелось бы услышать как кто делал, именно принцип а не кусок кода...
Executor
У тебя текстуры точно RGB16F ?
innuendo
>У тебя текстуры точно RGB16F ?
фз, я тоже думал может косяк в текстурах... В рендерманки вроде выставляешь другой формат, но не уверен что он действительно меняется...
Тема в архиве.