gpt4 book ai didi

c - 带阴影的快速 'ball' 像素光栅化例程

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:04:51 28 4
gpt4 key购买 nike

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

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

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

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

虽然有一些问题,但它似乎可以工作。例如,

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

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

    //  #

    然后当靠近时它会立即跳到类似的地方

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

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

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

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

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

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

最佳答案

法 vector

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

栅格化

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

    1. 做 2 个嵌套 for根据 x,y (中心+/-半径平方面积)
    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
  • 如果您仍想留在布雷森纳姆,请检查您实际使用的半径并修复 for 循环 (add +/- 1 or change <=/>= to </> or viceversa)

关于c - 带阴影的快速 'ball' 像素光栅化例程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26949613/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com