如何使用samplerCube作为数组 [英] How to use samplerCube as array

查看:319
本文介绍了如何使用samplerCube作为数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在将samplerCube用于点光源阴影贴图.对于多盏灯,我在下面将samplerCube实现为数组.

I am using samplerCube for a point light shadow map. For multiple lights, I implemented samplerCube as an array in the following.

uniform samplerCube pointShadowMapTexture[MAX_LIGHT];

但是以某种方式我无法为此samplerCube编制索引.着色器可以编译,没有问题.这适用于sampler2D阵列.

But somehow I can't index this samplerCube. Shader compiles and there is no problem. This is working for sampler2D arrays.

我尝试在着色器中使用[0],[1] ..为它建立索引,但始终使用相同的图像.我为每种光线发送了不同的立方体纹理,但着色器不知何故无法为其编入索引或不接受它.

I tried indexing it with [0], [1] .. in the shader but always the same image. I am sending different cube textures for each light but somehow shader doesn't index it or doesn't accept it.

我对定向光所做的工作与sampler2D阵列相同.但是当涉及到samplerCubes时,它是行不通的.

I am doing the same for directional lights as sampler2D array. But when it comes to samplerCubes it doesn't work.

将采样器多维数据集发送到着色器的代码

The code sending sampler cubes to the shader

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数组?

Is this valid for samplerCube type? If not what should I do to have an array of samplerCubes?

推荐答案

我意识到所有的灯都在显示最后一盏灯所见.因此,当我渲染模型时,我为每个灯光使用了最后一个灯光投影*视图矩阵. :)花了几个小时才意识到.

I realized that all lights are showing the what last light sees. So when I render model I was using the last light projection*view matrix for each light. :) It took hours to realize.

现在,每个光源都使用自己的矩阵进行渲染.

Now each light rendered with its own matrix.

如果遇到相同的问题,这可能会对某人有所帮助

this might help someone if encounters the same problem

 glEnable(GL_CULL_FACE);
    glCullFace(GL_FRONT);
    for(Light * light : Light::shadowCasterLights){
        glBindFramebuffer(GL_FRAMEBUFFER, light->depthMapFrameBuffer);App::checkFrameBufferError(__FILE__,__LINE__);
        glViewport(0,0,light->depthMapTextureSize,light->depthMapTextureSize);
        ShaderProgram::shaders[light->depthMapShader]->use("ShadowCaster Model");
        ShaderProgram::shaders[light->depthMapShader]->uniformMatrix4("ModelMatrix", &scene->ModelMatrix[0][0]);
        ShaderProgram::shaders[light->depthMapShader]->attributeBuffer("ModelSpaceVertexPosition", mesh->vertexBufferID, 3);

        switch (light->lightType) {
            case LightType::DIRECTIONAL:
                ShaderProgram::shaders[light->depthMapShader]->use("Light");
                ShaderProgram::shaders[light->depthMapShader]->uniformMatrix4("LightSpaceMatrix",&light->lightSpaceMatrix[0][0]);
                break;
            case LightType::POINT:
                ShaderProgram::shaders[light->depthMapShader]->use("Light");
                ShaderProgram::shaders[light->depthMapShader]->uniform3f("LightPosition" , &positionVector[0]);
                ShaderProgram::shaders[light->depthMapShader]->uniform1f("FarPlane" , light->farPlane);
                ShaderProgram::shaders[light->depthMapShader]->uniformMatrix4("LightSpaceMatrix[0]",&light->lightSpaceMatrixCube[0][0][0]);
                ShaderProgram::shaders[light->depthMapShader]->uniformMatrix4("LightSpaceMatrix[1]",&light->lightSpaceMatrixCube[1][0][0]);
                ShaderProgram::shaders[light->depthMapShader]->uniformMatrix4("LightSpaceMatrix[2]",&light->lightSpaceMatrixCube[2][0][0]);
                ShaderProgram::shaders[light->depthMapShader]->uniformMatrix4("LightSpaceMatrix[3]",&light->lightSpaceMatrixCube[3][0][0]);
                ShaderProgram::shaders[light->depthMapShader]->uniformMatrix4("LightSpaceMatrix[4]",&light->lightSpaceMatrixCube[4][0][0]);
                ShaderProgram::shaders[light->depthMapShader]->uniformMatrix4("LightSpaceMatrix[5]",&light->lightSpaceMatrixCube[5][0][0]);
                break;
        }
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh->elementBufferID);
        glDrawElements(
                GL_TRIANGLES,      // mode
                mesh->indices.size(),    // count
                GL_UNSIGNED_SHORT,   // type
                (void *) 0           // element array buffer offset
        );
        ShaderProgram::shaders[light->depthMapShader]->reset();
    }
    glCullFace(GL_BACK);
    glEnable(GL_CULL_FACE);
    glBindFramebuffer(GL_FRAMEBUFFER, 0);
    glViewport(0,0,1920,1080);

依靠阴影的力量

这篇关于如何使用samplerCube作为数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆