Как использовать samplerCube как массив - PullRequest
0 голосов
/ 21 июня 2020

Я использую samplerCube для карты точечных световых теней. Для нескольких источников света я реализовал samplerCube в виде следующего массива.

uniform samplerCube pointShadowMapTexture[MAX_LIGHT];

Но почему-то я не могу проиндексировать этот samplerCube. Шейдер компилируется и проблем нет. Это работает для sampler2D массивов.

Я пробовал индексировать его с помощью [0], [1] .. в шейдере, но всегда одно и то же изображение. Я отправляю разные текстуры куба для каждого источника света, но каким-то образом шейдер не индексирует его или не принимает.

Я делаю то же самое для направленных источников света как массив sampler2D. Но когда дело доходит до samplerCubes, это не работает.

Код, отправляющий кубы сэмплера в шейдер

void ShaderProgram::bindTexture(GLenum target , const char * name , int id){
    GLuint TextureID  = glGetUniformLocation(programID, name);
    glActiveTexture(GL_TEXTURE0 + textureOrder);
    glBindTexture(target , id);
    glUniform1i(TextureID, textureOrder);
    textureOrder++;
    App::checkErrors(__FILE__,__LINE__,name);
}
//depthMapTexture is member of Light class
std::string PointShadowMapTexture = "pointShadowMapTexture[" + std::to_string(LightNumber) + "]";
ShaderProgram::shaders["deferred"]->bindTexture(GL_TEXTURE_CUBE_MAP, PointShadowMapTexture.data(), depthMapTexture );
float SoftPointShadowCalculation(int index , vec3 fragPos ,vec3 lightPos){
    vec3 fragToLight = fragPos - lightPos;
    float currentDepth = length(fragToLight);
    float shadow = 0.0;
    float bias = 0.0;
    int samples = 20;
    float viewDistance = length(viewPos - fragPos);
    float diskRadius = (1.0 + (viewDistance / farPlane)) / 25.0;
    for(int i = 0; i < samples; ++i){
        float closestDepth = texture(pointShadowMapTexture[index], fragToLight + gridSamplingDisk[i] * diskRadius).r;
        closestDepth *= farPlane;//farplane
        if(currentDepth - bias > closestDepth){
            shadow += 0.5;
        }
    }
    shadow /= float(samples);
    return shadow;
}

Верно ли это для типа samplerCube? Если нет, что мне делать, чтобы получить массив samplerCubes?

1 Ответ

0 голосов
/ 21 июня 2020

Я понял, что все огни показывают то, что видит последний свет. Поэтому, когда я рендерил модель, я использовал матрицу последней проекции света * для каждого источника света. :) Потребовалось несколько часов, чтобы понять. теней

...