自己实现带有光线投射的 phong 照明

Posted

技术标签:

【中文标题】自己实现带有光线投射的 phong 照明【英文标题】:own implementation of phong illumination with ray casting 【发布时间】:2013-01-19 23:27:20 【问题描述】:

我正在尝试从头开始用 java 编写一个程序,该程序使用光线投射技术和 phong 照明渲染一个球体,但我有点迷茫。

我了解 phong 方程系数背后的概念,但我不明白如何获得向量值,以及这一切与光线投射有什么关系

假设我想在屏幕中间渲染球体,并且我有它的位置和半径,所以 (cx,cy,r)。我现在究竟从哪里开始?我究竟如何得到向量值?我的想法如下(伪代码)

int cx = window width/2
int cy = window height/2
int r = 30;
for(i = 0 -> window height) 
    for(j = 0 -> window width) 
        if( (j-cx)^2 + (i-cy)^2 < r^2) 
            //point inside
            Color c = phong(arguments..)
            draw pixel j,i with color c
        

    

但我不知道这是否正确,如果正确,我如何获得向量值,对于初学者来说,Normal?

你能指出我正确的方式吗?我已经尝试了很多谷歌搜索但没有成功,提前谢谢你

【问题讨论】:

几年前,我用 Java 写了一个非常非常简单的光线追踪器:github.com/gkopff/stingray - 也许这会给你一些启发。 【参考方案1】:

用于计算法线的向量通常来自真实几何对象的镶嵌(近似)。所以你把球体分成三角形。那么每个三角形(p1,p2,p3)都有自己的法向量((p2-p1)×(p3-p1)。

phong 着色方法是一种 插值,然后(理想情况下)模糊线条,放弃您正在绘制三角形而不是 真正的 领域。不过,这对侧面的角落没有帮助。 :(

对于镶嵌,一种方法是使用Bezier surface patches 近似球体,然后可以将其细分为适当的小尺寸并简化为三角形。 My question over here 探索绘制茶壶的工作(主要是旋转表面,与球体不同)。

【讨论】:

以上是关于自己实现带有光线投射的 phong 照明的主要内容,如果未能解决你的问题,请参考以下文章

blinn phong 照明产生奇怪的结果

Unity 中的光线投射和计时器问题

Libgdx Box2d Raycast无法投射多条光线

Phong 着色模型

使用 Phong 模型的点光源照明

Hololens 2 的光线投射问题