【问题标题】:fast 'ball' pixel-rasterization routine with shading带阴影的快速“球”像素光栅化程序
【发布时间】:2014-11-15 19:09:07
【问题描述】:

我需要一些 C 语言中的简单“球”光栅化例程。

我根据中点-布雷森汉姆给自己做了一些东西 我首先计算的算法(在维基百科中查看) x-y 屏幕平面上的圆点

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

然后对于每条扫描线,我都会选择“第二个”中点,这次 在 x-z 平面上并更新深度缓冲区 z 值。

它似乎工作,虽然它有一些麻烦。例如,

  1. 据我所知透视变换不投球 到圆圈,但可能是椭圆,这样我的光栅化算法 它作为圆圈不太正确。

  2. 对于小圆圈,看起来像的一个点球之间有一个跳跃 喜欢

    //  #
    

    然后当靠近它时,它会立即跳转到类似的东西

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

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

我不确定这是否是中点算法的结果 或者我做错了什么。

另一个问题是当我得到这个算法时,我想 它的阴影版本。 例如,我需要知道光栅化的每个像素的正常值 球(将其用于带有光线的点)。 有人可以为这种像素法线提供一些公式吗?

也许有一些更快的着色方法?

简而言之,我需要一些建议来改进我所拥有的东西, 特别是我想要它的阴影版本(工作比完美更重要 但是在准确性上进行一些改进也是正确的)。

【问题讨论】:

  • 如果你想要“球”使用glutSolidSphere(radius),如果你一直在使用透视投影,那么你怎么能期望你的球应该是球体?
  • 当你渲染一个运动物体的完美细节时,它看起来不如你渲染一个物体的“建议”。至于椭圆,除非轴具有不相等的比例,否则球会在 2D 中投影为圆形,但指向行进方向的椭圆可能有助于产生运动错觉。
  • @wv 不认为球会是一个圆圈,我有一些光线跟踪代码(它可以提供完美的投影),并且非常明显的球在那里变形,尤其是如果视图设置了一些广角,但是wiev的这个x角和y角与viewport窗口大小成正比
  • 特别需要这个球的法线方程(球由半径定义,比如原点为 0,0)对于点 x,y 看起来像法线,其中 x 从 -R 到 R Y 相同 - 给定 x,y...tnx 的法线向量是什么
  • 只有在宽屏电视体育节目中出现椭圆形球。在图形投影中,无论您使用什么视角或视角,球的轮廓圆周上的所有点与眼睛/相机的距离都相同,并且球的最近点是中心。

标签: c algorithm graphics 3d


【解决方案1】:

法线向量

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

光栅化

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

    1. 每个 x,y 嵌套 2 个 fors(中心 +/- 半径正方形区域)
    2. 忽略超出范围的像素x*x+y*y>r*r
    3. 通过球体方程计算z
      • x*x+y*y+z*z=r*r
      • z=sqrt(r*r-x*x-y*y)
      • 计算normal_vector
    4. 应用透视变换
      • (x,y,z) 只保持正常状态
    5. 计算阴影颜色并输出像素
      • 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
  • 如果您仍想留在 bresenham,请检查您实际使用的半径并修复 for 循环 (add +/- 1 or change <=/>= to </> or viceversa)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    • 2020-10-05
    • 2012-01-04
    • 2018-03-31
    • 1970-01-01
    相关资源
    最近更新 更多