2d纹理采用UV坐标作为索引,一个本地坐标系的顶点,对应一个或多个UV坐标,通过设置不同偏移量加载对应的顶点数据就能实现。
扯远了,回到Cube Map,我们都知道,Cube Map不同于2D的UV纹理,使用的是一个方向向量作为索引,从原点向方向向量射出,从而以集中的点的值作为该向量对应的纹理值。
那么这个向量从哪里来呢,我们往往会假设将这样的Cube Map贴在一个立方体上,则立方体使用顶点坐标就能作为纹理采样的向量。
好了进入正题,我再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网页,查看了其中源码的计算球面谐波函数的系数向量的函数,找到了作者留下的链接,不得不说,国外的教学用系列材料就是准备的充分啊==。
Comments NOTHING