参考[http://www.rorydriscoll.com/2012/01/15/cubemap-texel-solid-angle/]

计算diffuse irradiance map或者求解sh系数的时候,需要对整个球面进行积分,由于cubemap不同位置的像素投影到球面上面积不同,所以不能平等的对待所有像素。

这时候就需要计算每个像素对应的solid angle。

如图,单位球位于原点。选取cubemap的一个面,假设其位于z=1的平面上。一个像素的立体角大小就是其投影到球面上的面积。

关于面积的求解分三步进行:

1. 计算平面上一点(x,y,1)投影到球面上后的坐标p'。

2. p'关于x方向和y方向的方向导数,两个方向导数叉乘的模长即为微面元的面积。

3. 对微面元积分,求得(0,0,1)-  (x,y,1)对应四边形的投影面积(立体角),然后利用这个公式就能求得一个像素的立体角。

-----------------------------------------------------------------------------------------------------------------------

1. p'就是一个放缩操作:

2. 两个方向导数:

这两个向量叉乘的结果:

然后叉乘的模长即为微面元的面积:

3. 积分,计算(0,0)到像素点(s,t)的立体角

4. 如果想计算四边形ABCD的立体角,则:S = f(A) - f(B) + f(C) - f(D)

--------------------------------------------------------------------------------------------------------------------------------------------

代码:

double sphereQuadrantArea(double x, double y) {
return std::atan2(x*y, std::sqrt(x*x + y*y + 1));
} double solidAngle(size_t dim, size_t u, size_t v) {
const double iDim = 1.0f / dim;
double s = ((u + 0.5) * 2*iDim) - 1;
double t = ((v + 0.5) * 2*iDim) - 1;
const double x0 = s - iDim;
const double y0 = t - iDim;
const double x1 = s + iDim;
const double y1 = t + iDim;
double solidAngle = sphereQuadrantArea(x0, y0) -
sphereQuadrantArea(x0, y1) -
sphereQuadrantArea(x1, y0) +
sphereQuadrantArea(x1, y1);
return solidAngle;
}

  

Solid Angle of A Cubemap Texel - 计算Cubemap的一个像素对应的立体角的大小的更多相关文章

  1. 计算两个YUV420P像素数据的PSNR---高等算法

    PSNR是最基本的视频质量评价方法.本程序中的函数可以对比两张YUV图片中亮度分量Y的PSNR.函数的代码如下所示. /** * Calculate PSNR between 2 YUV420P fi ...

  2. C语言之计算字符串最后一个单词的长度,单词以空格隔开

    //计算字符串最后一个单词的长度,单词以空格隔开. #include<stdio.h> #include<string.h> #include<windows.h> ...

  3. test_1 计算字符串最后一个单词的长度,单词以空格隔开

    题目描述:计算字符串最后一个单词的长度,单词以空格隔开.  输入描述: 一行字符串,非空,长度小于5000. 输出描述: 整数N,最后一个单词的长度. #coding=utf-8 str = raw_ ...

  4. 怎么计算Oracle的表一条记录占用空间的大小

    如何计算Oracle的表一条记录占用空间的大小? 如何计算Oracle的表记录占用空间的大小? 是把所有字段的大小都加起来吗?varchar(256),char,number算几个字节? ------ ...

  5. 计算时间:一个C++运算符重载示例

    Time类是一个用于计算时间的类,其原型如下:程序清单11.1 mytime0.h // mytime0.h -- Time class before operator overloading #if ...

  6. 计算字符串最后一个单词的长度,单词以空格隔开。 java算法

    import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner in = ne ...

  7. scala中计算的的一个小问题,超出Int.maxValue时不会报错

    如果小于Int.max时他不会报错 def sumcount(str:String): Int ={ val ints = for(c <- str)yield { println(c.asIn ...

  8. js计算当前日期上一个月和下一个月

    /**         * 获取上一个月         *         * @date 格式为yyyy-mm-dd的日期,如:2014-01-25         */        funct ...

  9. 目标检測的图像特征提取之(一)HOG特征

    1.HOG特征: 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检測的特征描写叙述子.它通过计算和统计图像局部区 ...

随机推荐

  1. PAT_A1147#Heaps

    Source: PAT A1147 Heaps (30 分) Description: In computer science, a heap is a specialized tree-based ...

  2. 51nod1117 聪明的木匠【贪心+优先队列】

    一位老木匠需要将一根长的木棒切成N段.每段的长度分别为L1,L2,......,LN(1 <= L1,L2,-,LN <= 1000,且均为整数)个长度单位.我们认为切割时仅在整数点处切且 ...

  3. python项目开发:用RabbitMQ实现异步RPC

    程序要求: 1. 用Rabbit MQ实现RPC 1. 可以异步地执行多条命令 2. 可以对一次性对多个机器执行命令 程序效果: --->run dir host1 host2 .... --- ...

  4. SPOJ 1812 LCS2 - Longest Common Substring II (后缀自动机、状压DP)

    手动博客搬家: 本文发表于20181217 23:54:35, 原地址https://blog.csdn.net/suncongbo/article/details/85058680 人生第一道后缀自 ...

  5. arcgis for javascript 添加featurelayer,设置地图最大最小等级

    转自原文arcgis for javascript 添加featurelayer,设置地图最大最小等级 var map; var livingCenter; var livingCenterUrl = ...

  6. POJ 2486

    因为苹果可能在不同的子树中,所以,很容易想到设状态dp_back[i][j]为以i点为树根走j步并回到i点的最大苹果数与dp_to[i][j]不回到i点的两个状态. 于是,转移方程就很明显了.只是注意 ...

  7. 初步了解Shuttle ESB

    ESB:EnterpriseService Bus,即企业服务总线.它是传统中间件技术与XML.Web服务等技术结合的产物.从面向服务体系架构发展而来. ESB採用了"总线"这种模 ...

  8. 根据图片url地址获取图片的宽高

    /** * 根据img获取图片的宽高 * @param img 图片地址 * @return 图片的对象,对象中图片的真实宽高 */ public BufferedImage getBufferedI ...

  9. HTML的表单form以及form内部标签

    <html> <head> <title> form表单的使用 </title> <!-- 标签名称:form 表单标签 属性:action:提交 ...

  10. UVAlive 6560 - The Urge to Merge(状压dp)

    LA 6560 - The Urge to Merge option=com_onlinejudge&Itemid=8&page=show_problem&problem=45 ...