Я использую 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?