Dmitry_Milk
Про возню ЗыМастера с УЭ, ты же ему отвечал
Рендерферма кроликов, а, ну так он привел аргумент, зачем он хотел три отдельных угла - чтоб иметь возможность вернуть исходное состояние вращением трекбола. Без трех отдельных углов вернуться точно в исходное состояние можно только через undo.
Можно ли сейчас посчитать свет в сцене прямо на гпу и в шейдере записать результат в текстуру? Свет простой, буквально n dot l плюс шедоумапы с PCF, может еще сферические гармоники если источников много.
Фбо не подойдет т.к нужно писать в текстуру по координатам относительно интерполированного UV в фрагменте
Я просто не хотел софтрендер для такого писать, думал может на гпу можно уже)
Можно, через какой-нибудь imageStore. Или можно через FBO в два прохода: сначала выводим {x, y, значение} в FBO, потом рендерим этот FBO как массив точек.
https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html… -scale-factor
не очень понимаю как считается LOD текстуры
float2 dx = dFdx(uv ); float2 dy = dFdy( uv ); dx *= textureSize( tex, 0 ).x; dy *= textureSize( tex, 0 ).y; // вариант 1 float Pmax = Max( Length( dx), Length( dy) ); // вариант 2 float Px = Max( Abs( dx.x), Abs( dy.x) ); float Py = Max( Abs( dx.y), Abs( dy.y) ); float Pmax = Max( Px, Py ); float level = Log2( Pmax );
Обе версии отличаются от того, что расчитывается в textureQueryLod()
Ну вот считается максимальное из изменений dx, dy на пиксель, а номер лода это двоичный логарифм.
Там разве есть строгая формула?
1 frag / 2 deaths
Насколько я помню, там допускается произвольное приближение на усмотрение вендора, но не меньше чем Строгая Формула 1 и не больше чем Строгая Формула 2, ну и обязательно монотонная конечно же.
/A\
Попробуй ещё abs(dx)+abs(dy) — с плюсом вместо макса.
Имбирная Ведьмочка
> Попробуй ещё abs(dx)+abs(dy) — с плюсом вместо макса.
пробовал, length() ближе всего к вендорскому
> там допускается произвольное приближение на усмотрение вендора
Такой формулировки я не нашел, но из документации об этом можно догадаться, там только диапазоны.
А я хотел сделать 1 в 1.
}:+()___ [Smile]
О, спасибо большое, отличная идея юзануть вторую текстуру для мапы :)
monobogdan
> О, спасибо большое, отличная идея юзануть вторую текстуру для мапы :)
на гите есть проект который всё это делает, на opengl. Суть реализации у автора была в том что он рендерил сцену с позиции каждого треугольника и в несколько проходов получал неплохой запеченный свет.
Насколько плохо строить PVS через окклюжн квери? Иными словами бьем мир на сетку, для каждой позиции в мире рендерим камеру 8 раз с поворотами на +45 градусов по Y и собираем инфу о числе фрагментов в отрендеренных объектах, если хоть с одного угла объект видим - значит видим с текущего сектора (объекты за спиной отсечет фрустум). Печем инфу в данные и затем делаем простейшую и дешевую проверку в рантайме.
Игра не предполагает вертикальный геймплей, так что по ней можно и не печь
Обычно сетку разбивают на octree AABB(Axis-Aligned Bounding-Box) для просчета ambient occlusion.
Можно ли разбивать сетку на сферы\boxes и не юзать octree AABB ?
Хочется сделать код проще , чем octree.
То есть сфера определённого радиуса и проверить какие треугольники сетки попали в эту сферу.
Или из-за сферы могут возникнуть проблемы с треугольниками ?
из-за чего возникает такой эффект со светом? вот это белое вытянутое пятно. это из моего кода конечно, там все не правильно - но я раньше тыкал разные демо с deffered shading и forward+ - очень часто такой же эффект видел и там
war_zes
Спекуляр свет. Связан с нормалями и cameraPosition.
//vertex shader // Calculate the position of the vertex in the world. worldPosition = mul(input.position, worldMatrix); // Determine the viewing direction based on the position of the camera and the position of the vertex in the world. output.viewDirection = cameraPosition.xyz - worldPosition.xyz;
//pixel shader и в opengl fragment shader // Invert the light direction for calculations. lightDir = -lightDirection; // Calculate the reflection vector based on the light intensity, normal vector, and light direction. reflection = normalize(2.0f * lightIntensity * input.normal - lightDir); The amount of specular light is then calculated using the reflection vector and the viewing direction. The smaller the angle between the viewer and the light source the greater the specular light reflection will be. The result is taken to the power of the specularPower value. The lower the specularPower value the greater the final effect is. // Determine the amount of specular light based on the reflection vector, viewing direction, and specular power. specular = pow( saturate( dot( reflection, normalize( input.viewDirection))), specularPower);