布雷森汉姆的球体
Bresenham for spheres?
本文关键字:布雷森 更新时间:2023-10-16
我正在编写一个简单的软件渲染器,它效果很好,(使用三角形和球体/圆形原语)但我在深度缓冲区方面遇到了一些问题实现 - 我需要布雷森汉姆圈子的一个版本使用正确 3D 值的算法(需要填充深度缓冲区)。简单的"平面"2D圆形版本。
void FillCircleWithDepth(int x1, int y1, float z, int radius, unsigned color)
{
int left = x1-radius-1;
int right = x1+radius+1;
int up = y1-radius-1;
int down = y1+radius+1;
if(!_rectanglesOverlap(0, 0, CLIENT_X, CLIENT_Y,
left, up, right, down ) )
return;
int x = 0; //0
int y = radius; //1
int d1 = 3 - (2 * radius);
do
{
if (d1 < 0) d1 += (x<<2) + 6;
else d1 += ((x-(y--))<<2) + 10;
drawScanlineWithDepth(y1+x, x1-y, x1+y, z, color);
drawScanlineWithDepth(y1-x, x1-y, x1+y, z, color);
drawScanlineWithDepth(y1+y, x1-x, x1+x, z, color);
drawScanlineWithDepth(y1-y, x1-x, x1+x, z, color);
x++;
}
while(x<y);
}
带来深度缓冲区错误,绘图时还需要计算正确的z扫描线。它的3D版本会是什么样子?
//编辑
我在这里找到了几个接近的问题,但没有一个对此的确切答案 - 需要普雷森汉姆领域。。有人可以回答吗?
就像 3D 投影下的三角形一样,1/z 的倒数是线性的; 对于每个运动 x+=dx 或 y+=dy,都涉及与 z 倒数的线性差分关系:rec_z(x+dx,y+dy) = rec_z(x,y) + a*dx + b*dy,其中 a 和 b IIRC 几乎与平面的法向量微不足道。
这就引出了另一点:法线向量有三个分量。虽然从绘制三角形中并不明显,但在透视校正下绘制圆圈不仅仅是缩放 x 和 y,而是有更多的自由度。
(此处为此类图像的示例) - 出于版权原因,它是一个链接而不是嵌入。
相关文章:
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 通过构造函数错误地播种梅森扭曲
- OpenGL:布雷森汉姆的线条绘制算法实现
- 布雷森汉姆线抽屉在渲染任何内容之前经过一定循环后崩溃
- 梅森捻捻机在C++11中的最佳常数种子
- 借助直接采样或布雷森汉姆类型采样在 3D 三角形上生成采样点
- 控制两个顶点之间的中间点数量 - 布雷森汉姆算法的扩展
- 多线程 - 彼得森算法不起作用
- 梅森费尔托斯特种子作为成员变量
- 为PHP构建萨克森/C时的错误
- 布雷森汉姆的球体
- 我试图找到梅森素数
- 为什么我的斯特拉森矩阵乘法很慢?
- 我正在制作动物森友会克隆,但在渲染播放器时遇到问题
- 在没有ASLR的情况下猎杀一只消失的(记忆,GC相关)黑森博格
- 布雷森汉姆的中点算法,如何填补空白?
- OpenGL布雷森汉姆线
- 布雷森汉姆线算法与朴素向量加法
- 布雷森汉姆算法
- c++ 布雷森汉姆的线算法绘制弧形和旋转