2d纹理采用UV坐标作为索引,一个本地坐标系的顶点,对应一个或多个UV坐标,通过设置不同偏移量加载对应的顶点数据就能实现。

扯远了,回到Cube Map,我们都知道,Cube Map不同于2D的UV纹理,使用的是一个方向向量作为索引,从原点向方向向量射出,从而以集中的点的值作为该向量对应的纹理值。

那么这个向量从哪里来呢,我们往往会假设将这样的Cube Map贴在一个立方体上,则立方体使用顶点坐标就能作为纹理采样的向量。

cubemaps_sampling

好了进入正题,我再prt中因为要使用Cube Map存储环境光贴图,在进行预计算,所以有这样的代码


  const Eigen::Vector3f cubemapFaceDirections[6][3] = {
        {{0, 0, 1}, {0, -1, 0}, {-1, 0, 0}},  // negx
        {{0, 0, 1}, {0, -1, 0}, {1, 0, 0}},   // posx
        {{1, 0, 0}, {0, 0, -1}, {0, -1, 0}},  // negy
        {{1, 0, 0}, {0, 0, 1}, {0, 1, 0}},    // posy
        {{-1, 0, 0}, {0, -1, 0}, {0, 0, -1}}, // negz
        {{1, 0, 0}, {0, -1, 0}, {0, 0, 1}},   // posz
    };

    template <size_t SHOrder>
                                                    //Cube Map ,宽,高,通道数
    std::vector<Eigen::Array3f> PrecomputeCubemapSH(const std::vector<std::unique_ptr<float[]>> &images,
                                                    const int &width, const int &height,
                                                    const int &channel)
    {
        std::vector<Eigen::Vector3f> cubemapDirs;
        cubemapDirs.reserve(6 * width * height);
        for (int i = 0; i < 6; i++)
        {
            Eigen::Vector3f faceDirX = cubemapFaceDirections[i][0];
            Eigen::Vector3f faceDirY = cubemapFaceDirections[i][1];
            Eigen::Vector3f faceDirZ = cubemapFaceDirections[i][2];
            for (int y = 0; y < height; y++)
            {
                for (int x = 0; x < width; x++)
                {
                    float u = 2 * ((x + 0.5) / width) - 1;
                    float v = 2 * ((y + 0.5) / height) - 1;
                    //可以看到这里采用了和opengl不一样的方法来得到cube采样的dir
                    Eigen::Vector3f dir = (faceDirX * u + faceDirY * v + faceDirZ).normalized();
                    std::cout << dir;
                    cubemapDirs.push_back(dir);
                }
            }
        }
//后续prt代码省略

    }
}

https://www.bogotobogo.com/Algorithms/uniform_distribution_sphere.php

我沿着nori引擎的github网页,查看了其中源码的计算球面谐波函数的系数向量的函数,找到了作者留下的链接,不得不说,国外的教学用系列材料就是准备的充分啊==。