A_A_S05 2024-09-17 12:35 采纳率: 66.7%
浏览 2
已结题

立方体贴图数组传入问题

在尝试编写多光源阴影的过程中,发现了关于samplerCube的问题,怎样才能正确地以数组形式传入多个立方体贴图?我现在代码如下:

for (int i = 0; i < 4; ++i) {
    // 激活纹理单元
    glActiveTexture(GL_TEXTURE1 + i);
    // 绑定立方体贴图纹理
    glBindTexture(GL_TEXTURE_CUBE_MAP, depthCubeMaps[i]);
    shader.setInt("depthMap[" + std::to_string(i) + "]", i + 1);
}

着色器代码:

uniform samplerCube depthMap[4];

但是读取失败。网上也没找到samplerCubeArray的代码示范

  • 写回答

1条回答 默认 最新

  • 码踏云端 Java领域新星创作者 2024-09-17 12:45
    关注

    在OpenGL中,samplerCube 是用于采样立方体贴图的类型,而 samplerCubeArray 是用于采样立方体贴图数组的类型。你的问题在于使用了 samplerCube 数组,但没有正确地传递和绑定立方体贴图数组。

    解决方案

    1. 使用 samplerCubeArray
      你需要使用 samplerCubeArray 类型来采样立方体贴图数组。samplerCubeArray 允许你在一个统一的采样器中处理多个立方体贴图。

    2. 绑定立方体贴图数组
      你需要将多个立方体贴图绑定到一个纹理数组中,并使用 samplerCubeArray 进行采样。

    具体步骤

    1. 创建和绑定立方体贴图数组

    首先,创建一个立方体贴图数组,并将每个立方体贴图绑定到数组中。

    GLuint depthCubeMapArray;
    glGenTextures(1, &depthCubeMapArray);
    glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, depthCubeMapArray);
    
    // 为每个立方体贴图分配内存
    glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_DEPTH_COMPONENT, width, height, 4 * 6, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
    
    // 设置纹理参数
    glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
    
    // 绑定每个立方体贴图到数组中
    for (int i = 0; i < 4; ++i) {
        glBindTexture(GL_TEXTURE_CUBE_MAP, depthCubeMaps[i]);
        for (int face = 0; face < 6; ++face) {
            glCopyTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, 0, 0, i * 6 + face, 0, 0, width, height);
        }
    }
    

    2. 在着色器中使用 samplerCubeArray

    在着色器中,使用 samplerCubeArray 类型来采样立方体贴图数组。

    #version 330 core
    
    uniform samplerCubeArray depthMap;
    
    in vec3 fragPos;
    
    void main() {
        // 采样立方体贴图数组
        float depth = texture(depthMap, vec4(fragPos, 0)).r;
        // 其他处理...
    }
    

    3. 传递纹理单元

    在C++代码中,将立方体贴图数组绑定到一个纹理单元,并传递给着色器。

    // 激活纹理单元
    glActiveTexture(GL_TEXTURE1);
    // 绑定立方体贴图数组纹理
    glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, depthCubeMapArray);
    shader.setInt("depthMap", 1);
    

    完整代码示例

    C++代码

    #include <GL/glew.h>
    #include <GLFW/glfw3.h>
    #include <iostream>
    
    GLuint depthCubeMaps[4];
    GLuint depthCubeMapArray;
    
    void init() {
        // 创建4个立方体贴图
        glGenTextures(4, depthCubeMaps);
        for (int i = 0; i < 4; ++i) {
            glBindTexture(GL_TEXTURE_CUBE_MAP, depthCubeMaps[i]);
            // 为每个立方体贴图分配内存
            for (int face = 0; face < 6; ++face) {
                glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, 0, GL_DEPTH_COMPONENT, width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
            }
            // 设置纹理参数
            glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
            glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
            glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
            glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
            glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
        }
    
        // 创建立方体贴图数组
        glGenTextures(1, &depthCubeMapArray);
        glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, depthCubeMapArray);
        // 为每个立方体贴图分配内存
        glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_DEPTH_COMPONENT, width, height, 4 * 6, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
        // 设置纹理参数
        glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
        glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
        glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
    
        // 绑定每个立方体贴图到数组中
        for (int i = 0; i < 4; ++i) {
            glBindTexture(GL_TEXTURE_CUBE_MAP, depthCubeMaps[i]);
            for (int face = 0; face < 6; ++face) {
                glCopyTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, 0, 0, i * 6 + face, 0, 0, width, height);
            }
        }
    }
    
    void render() {
        // 激活纹理单元
        glActiveTexture(GL_TEXTURE1);
        // 绑定立方体贴图数组纹理
        glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, depthCubeMapArray);
        shader.setInt("depthMap", 1);
    
        // 渲染场景...
    }
    

    着色器代码

    #version 330 core
    
    uniform samplerCubeArray depthMap;
    
    in vec3 fragPos;
    
    void main() {
        // 采样立方体贴图数组
        float depth = texture(depthMap, vec4(fragPos, 0)).r;
        // 其他处理...
    }
    

    总结

    通过使用 samplerCubeArray 类型和绑定立方体贴图数组,你可以正确地传递和采样多个立方体贴图。确保在C++代码中正确创建和绑定立方体贴图数组,并在着色器中使用 samplerCubeArray 进行采样。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 9月25日
  • 已采纳回答 9月17日
  • 创建了问题 9月17日

悬赏问题

  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 在虚拟机环境下完成以下,要求截图!
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见