我需要在c
中使用一些简单的“球”光栅化程序我根据中点 - 布雷森汉姆给自己做了些什么 算法(在维基百科中看到)我首先计算的地方 x-y屏幕平面中的圆点
// XXX
// XXXXX
// XXXXXX
// XXXXXXX
// XXXXXXXX
// XXXXXXXX
// XXXXXXXXX
// XXXXXXXXX
// XXXXXXXXX
然后对于每条扫描线,我这次使用'第二'中点 在x-z平面和更新深度缓冲区z值
虽然它有一些麻烦(例如),它似乎工作视角变换,据我所知,不要投球 圆圈,但可能是elipses所以这是我的栅格化算法 它作为圆圈不太正确
对于小圆圈,在1个球的外观之间有一个跳跃 像
//#
然后当得到clossser时,它会立即跳到类似的东西
// #
//#####
//#####
// #
或
// ##
//######
//######
// ##
我不确定这是否是中点算法的结果 或者我犯错了)
其他问题是,当我得到这个我的算法时,我想 它的着色版本 我需要例如知道我的光栅化的每个像素的正常 球(用于点光线) 有人能为像素的这个法线提供一些公式吗?
也许有更快的阴影方法吗?
简而言之,我需要一些建议来改进我得到的东西, esp想要它的阴影版本(更重要的是工作而不是完美 但是一些关于正确性的改进也是正确的。)
tnx for hints
答案 0 :(得分:1)
普通矢量
(x,y,z)
(x-x0,y-y0,z-z0)
(x0,y0,z0)
是球体中心<强>光栅化强>
所以光栅化看起来像这样:
for
(中心+/-半径方形区域)做2个嵌套x,y
x*x+y*y>r*r
z
x*x+y*y+z*z=r*r
z=sqrt(r*r-x*x-y*y)
normal_vector
(x,y,z)
只保留正常pixel_color=ball_color*(ambient_light_intensity+directional_light_intensity*dot(normal_vector,light_direction_vector));
另请看这里:Drawing 3D sphere in C/C++ (voxel space surface only rendering)只使用XY平面投影
尺寸跳跃
add +/- 1 or change <=/>= to </> or viceversa
)