游戏开发论坛

 找回密码
 立即注册
搜索
楼主: moremoretime

[ 问题 ] 如果做个software rendER

[复制链接]

11

主题

145

帖子

150

积分

注册会员

Rank: 2

积分
150
发表于 2004-12-19 21:42:00 | 显示全部楼层

Re: Re:[ 问题 ] 如果做个software rendER

moremoretime: Re:[ 问题 ] 如果做个software rendER

是需要写很多东西,这样可以深入的了解一下渲染管线.
另外,这些既然全是软件模拟的,那这些BUFFER也就是内存了,精度可以任意的高了,比如
128位的Z-BUFFER等等,还有就是这不等于就是可编程的完整管线吗,自由度无限大,想想更有动力了.


嘿~~,你真弓虽~~

我准备看你的128位的z-buffer,哇哈哈哈~ [em16]

22

主题

274

帖子

274

积分

中级会员

Rank: 3Rank: 3

积分
274
 楼主| 发表于 2004-12-19 21:49:00 | 显示全部楼层

Re:[ 问题 ] 如果做个software rendER

呵呵,现在只是构想,理论上还算可行.
假设640*480分辨率的WINDOW,128BIT Z-BUFFER不到 5M,只是可能有点慢.

11

主题

145

帖子

150

积分

注册会员

Rank: 2

积分
150
发表于 2004-12-19 21:59:00 | 显示全部楼层

Re:[ 问题 ] 如果做个software rendER

问问理论上有什么可行法??

是什么理论,我倒很想听听,呵呵~

6

主题

444

帖子

457

积分

中级会员

Rank: 3Rank: 3

积分
457
发表于 2004-12-19 22:44:00 | 显示全部楼层

Re:[ 问题 ] 如果做个software rendER

128bit Z-buffer?不见得有用而且实现速度很慢,由于128位的运算问题(1:是FP128还是FX128?2:既然z-buffer都是128bit,那之前的所有矩阵运算都得至少是FP128才有意义)……另外,用z-buffer还不如用w-buffer。

对了,谁能够告诉我texture anisotropic filtering的实现方法和公式?

2

主题

50

帖子

58

积分

注册会员

Rank: 2

积分
58
发表于 2004-12-20 10:56:00 | 显示全部楼层

Re: [ 问题 ] 如果做个software rendER

用128bit depth还不如128bit color划算。

对了,谁能够告诉我texture anisotropic filtering的实现方法和公式?


恩,这个具体记不大清了,不敢保证完全正确,书不在。。。
大概:

2^m*2^n的texture
s(x)为screen x到s纹理坐标的映射;t(y)一样得
u = 2^m*s(x); v = 2^n*t(y)

a = u对x求偏导, b = v对y, c= u对y, d = v对x

p(x) = (a^2+b^2)^0.5
p(y) = (c^2+d^2)^0.5

这样,mipmap级别 l = min(anisotropy, p(x)/p(y) )
注意是当px>py。计算次数当然是px/py。即是对较大方向上多次计算。
x,y关系互换一样得。

传统计算mipmap是 l = max(p(x), p(y))


ps:你知道怎么证明告诉一下哈:)



22

主题

274

帖子

274

积分

中级会员

Rank: 3Rank: 3

积分
274
 楼主| 发表于 2004-12-20 11:36:00 | 显示全部楼层

Re:[ 问题 ] 如果做个software rendER

呵呵,果然很欠考虑.
1.当初考虑128BIT比较采用4级32位的方法,像一般数字那样,从高到低比较;
2.确实前面的精度不够,后面再高可能也没有意义,不过两个32BIT精度应该能产生最多64BIT,如果多个MATRIX乘下来,精度也可能达到很高的,只不过这里的加减乘除法按我的定义做,就是两个32BIT的FLOAT的结果为64BIT没有精度损失.

另外,14楼 那个 纹理各向异性过滤 是不是就相当于 按深度插值.
还有,回15楼,其实我考虑这么高精度Z-BUFFER,只不过想避免 可能产生的 Z-CONFUSION,至少不用进行透视校正或者什么多边形偏移.

不知道这些考虑有没有问题?

2

主题

50

帖子

58

积分

注册会员

Rank: 2

积分
58
发表于 2004-12-20 11:53:00 | 显示全部楼层

Re: [ 问题 ] 如果做个software rendER

另外,14楼 那个 纹理各向异性过滤 是不是就相当于 按深度插值.
还有,回15楼,其实我考虑这么高精度Z-BUFFER,只不过想避免 可能产生的 Z-CONFUSION,至少不用进行透视校正或者什么多边形偏移.

不知道这些考虑有没有问题?


纹理各向异性过滤是对传统trilinear filtering等用到mipmap的算法不正确计算的一种近似纠正。

Z-CONFUSION理论上是不可能完全消除的,不论精度。因为z-buffer的非线性分布。w-buffer当初被废弃好像是不是就是因为精度?如果用128bit倒是可以考虑下。

多边形偏移的需要是因为光栅化的误差。这个也应该于精度无关。


22

主题

274

帖子

274

积分

中级会员

Rank: 3Rank: 3

积分
274
 楼主| 发表于 2004-12-20 13:20:00 | 显示全部楼层

Re:[ 问题 ] 如果做个software rendER

回17楼.

我是想说 纹理各向异性过滤 处理的时候, 是不是把纹理坐标按 深度 进行插值 后 查找纹理,
这样比那些线性过滤方法 要正确,因为深度的非线性.

如果我把前面的顶点,MATRIX等都限制为32BIT,变换后128BIT应该够了,至少足以区分2个在32BIT精度上靠近的点的深度,这样Z-CONFUSION就应该没有了.

多边形偏移 不也是由于光删后 深度 的误差 而 采用的一种深度修正吗?如果精度够高,不也是可以不用了?!

这样对不对?

6

主题

444

帖子

457

积分

中级会员

Rank: 3Rank: 3

积分
457
发表于 2004-12-20 14:40:00 | 显示全部楼层

Re:[ 问题 ] 如果做个software rendER

回tomb4:
大概是我没有说清楚,我主要想问是如何实现那个anisotropic filter(比如2x8的texel下的filter kernel)关于anisotropic和mipmap layer的判断不是我问的主要问题。(我觉得这个是相对容易的,就如你所说的,光栅化时求出每个fragment在纹理空间的ddu和ddv然后与透视矫正因数运算一下就可以得到你公式中的偏导数然后接下来的就简单了)
w-buffer之所以被弃用我想大概主要是由于成本问题,精度问题只在其次(32bit的w-buffer效果就应该很不错)。其平均深度值与定点数的平均精度正好相配,换句话说,如果z-buffer使用的是浮点补数方式(也就是说远剪裁面是0,近剪裁面是1,z-buffer使用浮点数)那么估计也会得到不错的效果,糟就糟糕在z-buffer多数使用的是定点数,而几何空间深度的z-buffer表示为非线性……
回楼主:
你说的那个不是各向异性过滤,只是类似于透视矫正,设某fragnment在屏幕空间内的线性插值权重为h,线性插值两端点的w值分别为w1和w2,则矫正因子为w1/linearInterp(w2,w1,h)
至于精度,让我们来看看如果将FP32的小于1的正数转化为FX128的情况:
Fp32是s1e8m23。也就是说有23位尾数。加上归一化的整数位,一共24位,z-buffer的z-fighting主要发生在接近远剪裁面处,也就是z值接近1的地方,这样的浮点数的e值就不可能很小,比如我们设e-127=-3,也就是说z值在2^-3处附近,此时FP32所表示的精度换算成FX是多少位呢? 26位罢了,那么FX128有什么实际意义呢?

11

主题

145

帖子

150

积分

注册会员

Rank: 2

积分
150
发表于 2004-12-20 16:33:00 | 显示全部楼层

Re: Re:[ 问题 ] 如果做个software rendER

hourousha: Re:[ 问题 ] 如果做个software rendER

回tomb4:
大概是我没有说清楚,我主要想问是如何实现那个anisotropic filter(比如2x8的texel下的filter kernel)关于anisotropic和mipmap layer的判断不是我问的主要问题。(我觉得这个是相对容易的,就如你所说的,光栅化时求出每个fragment在纹理空间的ddu和ddv然后与透视矫正因数运算一下就可以得到你公式中的偏导数然后接下来的就简单了)
w-buffer之所以被弃用我想大概主要是由于成本问题,精度问题只在其次(32bit的w-buffer效果就应该很不错)。其平均深度值与定点数的平均精度正好相配,换句话说,如果z-buffer使用的是浮点补数方式(也就是说远剪裁面是0,近剪裁面是1,z-buffer使用浮点数)那么估计也会得到不错的效果,糟就糟糕在z-buffer多数使用的是定点数,而几何空间深度的z-buffer表示为非线性……
回楼主:
你说的那个不是各向异性过滤,只是类似于透视矫正,设某fragnment在屏幕空间内的线性插值权重为h,线性插值两端点的w值分别为w1和w2,则矫正因子为w1/linearInterp(w2,w1,h)
至于精度,让我们来看看如果将FP32的小于1的正数转化为FX128的情况:
Fp32是s1e8m23。也就是说有23位尾数。加上归一化的整数位,一共24位,z-buffer的z-fighting主要发生在接近远剪裁面处,也就是z值接近1的地方,这样的浮点数的e值就不可能很小,比如我们设e-127=-3,也就是说z值在2^-3处附近,此时FP32所表示的精度换算成FX是多少位呢? 26位罢了,那么FX128有什么实际意义呢?


透视较正要用积分的方法,嘿嘿~~,那样速度比较快

每条扫描线只加一个delta[em16]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-17 21:16

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表