Войти
ПрограммированиеФорумГрафика

Не работает Hardware PCF (GLSL, Vulkan)

Страницы: 1 2 Следующая »
#0
(Правка: 5:58) 5:54, 9 июня 2021

Пытаюсь задействовать хардварный PCF, но не получаю даже намека на сглаживание.

Фрагментный шейдер:

layout (binding = 5) uniform sampler2DShadow shadowMap;

float textureProj(vec4 shadowCoord, vec2 offset)
{
  float shadow = 1.0;

  if ( shadowCoord.z > -1.0 && shadowCoord.z < 1.0 ) {
    float dist = texture(shadowMap, vec3(shadowCoord.st + offset, shadowCoord.z + epsilon), bias).r;
    if (shadowCoord.w > 0 && dist < shadowCoord.z) {
      shadow = 0.15;
    }
  }
  return shadow;
}

Сэмплер:

  VkSamplerCreateInfo samplerInfo = {};
  samplerInfo.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
  samplerInfo.magFilter = VK_FILTER_LINEAR;
  samplerInfo.minFilter = VK_FILTER_LINEAR;

  samplerInfo.addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT;
  samplerInfo.addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT;
  samplerInfo.addressModeW = VK_SAMPLER_ADDRESS_MODE_REPEAT;

  samplerInfo.anisotropyEnable = VK_FALSE;
  samplerInfo.maxAnisotropy = 16;
  samplerInfo.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
  samplerInfo.unnormalizedCoordinates = VK_FALSE;
  samplerInfo.compareEnable = VK_TRUE;
  samplerInfo.compareOp = VK_COMPARE_OP_LESS;

  samplerInfo.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR;
  samplerInfo.mipLodBias = 0;

Вообще нет сглаживания, хоть тресни, хотя небольшое должно быть. Где может быть ошибка?


#1
6:20, 9 июня 2021

Почему если я использую texture без третьего параметра "bias" вот так:

float dist = texture(shadowMap, vec3(shadowCoord.st + offset, shadowCoord.z + epsilon)).r;
у меня вся сцена оказывается в тени?

#2
6:48, 9 июня 2021

рекомендую почитать, как реализуется pcf. в частности, что именно возвращает texture() для comparison семплера (или как он называется sampler2DShadow в glsl).

#3
7:57, 9 июня 2021

MikeNew
рабочий пример найди

#4
10:00, 9 июня 2021

Есть прогресс, я сэмплер не туда присобачил.

Теперь получатся вот так, но это несколько не то что мне нужно (нужен эффект, похожий на программный PCF, как на втором рисунке):

Изображение

innuendo
> рабочий пример найди
Нашел, там сэмплер точно такой-же, но там работает по другому:

Изображение

Что может быть упущено?

#5
(Правка: 10:22) 10:18, 9 июня 2021

MikeNew
> if (shadowCoord.w > 0 && dist < shadowCoord.z) {
этой строчки вообще быть не должно. читай, что возвращает вызов texture() для compare sampler'а.

PS кстати, я это считаю косяком синтаксиса glsl, который в свою очередь тащится из легаси opengl-хлама. почему есть специализированная функция textureGrad(), но нету специализированной функции textureCompare() и вместо неё используется перегруженная функция texture(), которая притворяется обычной текстурной выборкой?

#6
10:21, 9 июня 2021

Suslik
> этой строчки вообще быть не должно. читай, что возвращает вызов texture() для
> compare sampler'а.
Я прочитал, что дополнительно производится сравнение. Руки пока еще не доходили убрать, сейчас сделаю.

#7
10:36, 9 июня 2021

Suslik
> этой строчки вообще быть не должно.
Вот это вот сравнение:  "f ( shadowCoord.z < 1.0 )" убирать нельзя, иначе впереди появляется затемненная область. (в сэмлере VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER и VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE прописаны)

#8
(Правка: 12:33) 12:31, 9 июня 2021

Победа.
Результаты лучше чем я ожидал от дополнительного простенького программного PCF всего лишь на пять выборок и карты теней размером 2048. Хочу еще попробовать прикрутить какой-нибудь улучшайзер типа "монте-карло" или просто шум, может еще лучше получится (или нет).

Изображение
#9
12:08, 10 июня 2021

Suslik
> PS кстати, я это считаю косяком синтаксиса glsl, который в свою очередь тащится
> из легаси opengl-хлама. почему есть специализированная функция textureGrad(),
> но нету специализированной функции textureCompare() и вместо неё используется
> перегруженная функция texture(), которая притворяется обычной текстурной
> выборкой?

а как там в hlsl, напомни

#10
(Правка: 13:36) 13:33, 10 июня 2021

innuendo
> а как там в hlsl, напомни
там как раз нормально (более-менее): tex.Sample() для просто семплинга, tex.SampleLevel() для выборки по мипу и tex.SampleCmpLevelZero() для PCF. в gnm точно так же. а glsl все эти вызовы в кучу и называются одним texture() — мол, сами по типам аргументов разбирайтесь, что он именно возвращает. классический пример говнодизайна, от которого остерегает Zen of Python

Explicit is better than implicit.
#11
21:29, 10 июня 2021

Suslik
можно же просто один раз написать соответствующие враперы для функций с фиксированным количеством и типов аргументов под каждый случай с нужным названием. Надуманная проблема.

#12
22:24, 10 июня 2021

Aroch
> можно же просто один раз написать соответствующие враперы для функций с
> фиксированным
Не надо ничего писать, или разработчикам нечем больше заняться решать надуманные проблемы GLSL, надеясь на качество компилятора которые может зайнлайнит враперы. Появился  Vullkan и теперь можно использовать нормальный HLSL теперь на всех платформах и нормальных АПИ.

#13
22:33, 10 июня 2021

Aroch
> можно же просто один раз написать соответствующие враперы для функций с
> фиксированным количеством и типов аргументов под каждый случай с нужным
> названием.
Напиши, а то я что-то слабо понимаю как ты это собрался сделать.

#14
(Правка: 23:00) 22:57, 10 июня 2021

MrShoor

float myCoolName(sampler2DShadow sampler, vec3 P, float bias)
{
  return texture(sampler, P, bias);
}

Andrey
> надеясь на качество компилятора которые может зайнлайнит враперы
приведи примеры компилятора который не заинлайнит. glsl это не только пк.

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика