Всенаправленное Shadow Mapping - PullRequest
       43

Всенаправленное Shadow Mapping

2 голосов
/ 31 октября 2011

Я сделал отображение окружения с кубическими картами и теневым отображением в одном направлении с 2D-текстурой, но использование кубической карты для теневого отображения во всех направлениях доставляет мне много проблем.

Я недавно нашелиз-за того, что значение глубины, которое я получал от textureCube(), всегда было нулевым.Я предполагал, что эта линия работает, так как я использовал код, аналогичный коду окружения и теневому отображению для 2D-текстуры, а также потому, что gDEBugger показывает, что карта теней правильно копируется в память.

Вот частькода шейдера для сопоставления теней вместе с моими тестами отладки ...

uniform samplerCube shadowMap;
varying vec3 worldFragPosition, worldLightPos;

...

vec3 lightToFrag;
float shadowMapDepth;
bool inShadow;

inShadow = false; //used to darken color at the end
if (shadowMapEnabled)
{
    lightToFrag = worldFragPosition - worldLightPos;
    shadowMapDepth = textureCube(shadowMap, lightToFrag).r;

    if (shadowMapDepth > .75)
    {
        gl_FragColor = vec4(1.0, 0.0, 0.0, 0.0);
        return;
    }
    else if (shadowMapDepth > .5)
    {
        gl_FragColor = vec4(0.0, 1.0, 0.0, 0.0);
        return;
    }
    else if (shadowMapDepth > .25)
    {
        gl_FragColor = vec4(0.0, 0.0, 1.0, 0.0);
        return;
    }
    else if (shadowMapDepth > 0.0)
    {
        gl_FragColor = vec4(1.0, 1.0, 1.0, 0.0);
        return;
    }
    else if (shadowMapDepth < 0.0)
    {
        gl_FragColor = vec4(1.0, 0.0, 1.0, 0.0);
        return;
    }
    else
    {
        //... shadow mapping code
    }
}

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * всегда отбирается, и сцена визуализируется с использованием разбитого кода 'Shadow Map Mapping (в настоящее время все находится в тени по сравнению сглубина равна нулю).

Ранее я проверял lightToFrag, чтобы убедиться, что он не равен нулю, и явно проверял shadowMapDepth против нуля (несмотря на то, что он является плавающим).Я также проверил полное возвращаемое значение textureCube(shadowMap, lightToFrag), чтобы убедиться, что это нулевой вектор.

Единственное, что я могу думать о том, почему глубина всегда равна нулю, будет, если текстура не связанаправильно, но я не думаю, что я что-то забываю ...

samplerShadowMapLoc = glGetUniformLocation(progId, "shadowMap");
shadowMapEnabledLoc = glGetUniformLocation(progId, "shadowMapEnabled");

    ....

glUniform1i(shadowMapEnabledLoc, true);
glActiveTexture(GL_TEXTURE3);
glBindTexture(GL_TEXTURE_CUBE_MAP, light->getShadowMap()->getShadowMapId());
glUniform1i(samplerShadowMapLoc, 3);

for (unsigned int i=0; i < objects.size(); i++)
    if (objects.at(i)->getID() != light->getParent()->getID()) //don't draw light, it doesn't need shadows
        render(objects.at(i));
glUniform1i(shadowMapEnabledLoc, false);
render(light->getParent());

glUniform1i(shadowMapEnabledLoc, false);

Что может заставить textureCube возвращать нулевой вектор?Любая помощь будет оценена.

Ответы [ 2 ]

1 голос
/ 05 ноября 2011

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

0 голосов
/ 12 ноября 2011

Это, вероятно, не сильно поможет (я тоже хотел бы знать, как правильно сделать омни-тени за один проход с помощью кубической карты, ни одна информация, которую я смог найти, не была достаточно полной, чтобы помочь мне), но ...

Вы уверены, что правильно отображаете свою кубическую карту?Согласно этому SO-вопросу , вам необходим геометрический шейдер для рендеринга в кубическую карту.

...