快球'球带着色的像素光栅化例程

时间:2014-11-15 19:09:07

标签: c++ c algorithm graphics 3d

我需要在c

中使用一些简单的“球”光栅化程序

我根据中点 - 布雷森汉姆给自己做了些什么 算法(在维基百科中看到)我首先计算的地方 x-y屏幕平面中的圆点

// XXX
// XXXXX
// XXXXXX
// XXXXXXX
// XXXXXXXX
// XXXXXXXX
// XXXXXXXXX
// XXXXXXXXX
// XXXXXXXXX

然后对于每条扫描线,我这次使用'第二'中点 在x-z平面和更新深度缓冲区z值

虽然它有一些麻烦(例如

),它似乎工作
  1. 视角变换,据我所知,不要投球 圆圈,但可能是elipses所以这是我的栅格化算法 它作为圆圈不太正确

  2. 对于小圆圈,在1个球的外观之间有一个跳跃 像

    //#

  3. 然后当得到clossser时,它会立即跳到类似的东西

    //  #
    //#####
    //#####
    //  #
    

    //  ##
    //######
    //######
    //  ##
    

    我不确定这是否是中点算法的结果 或者我犯错了)

    其他问题是,当我得到这个我的算法时,我想 它的着色版本 我需要例如知道我的光栅化的每个像素的正常 球(用于点光线) 有人能为像素的这个法线提供一些公式吗?

    也许有更快的阴影方法吗?

    简而言之,我需要一些建议来改进我得到的东西, esp想要它的阴影版本(更重要的是工作而不是完美 但是一些关于正确性的改进也是正确的。)

    tnx for hints

1 个答案:

答案 0 :(得分:1)

普通矢量

  • 在球体上任意点(x,y,z)
  • 的法线
  • (x-x0,y-y0,z-z0)
  • 其中(x0,y0,z0)是球体中心
  • 所以你也需要Z坐标......
  • 应通过将最终点积除以半径来对其进行归一化...

<强>光栅化

  • 要计算Z轴,您需要 sqrt
  • 对于小半径,您可以使用查找表进行SQRT(并且仍然很快)
  • 所以光栅化看起来像这样:

    1. for(中心+/-半径方形区域)做2个嵌套x,y
    2. 忽略范围x*x+y*y>r*r
    3. 之外的像素
    4. 通过球体方程计算z
      • x*x+y*y+z*z=r*r
      • z=sqrt(r*r-x*x-y*y)
      • 计算normal_vector
    5. 应用透视变换
      • (x,y,z)只保留正常
    6. 计算着色颜色并输出像素
      • 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平面投影

尺寸跳跃

  • 可能是你的Bresenhams实施停止1次迭代太早或太晚
  • 点是视觉半径0,下一个尺寸是视觉半径2
  • 如果您仍想留在布雷森汉姆,请检查您实际使用的半径并修复for循环(add +/- 1 or change <=/>= to </> or viceversa