往上下方向看的时候模型被拉长
不仅是从上往下,只要是模型靠近屏幕的边缘、角落都会被拉伸。
这只是一个学习项目,目前没有动力去搞清楚原因并解决。
想问一下为什么画平顶平底三角形的时候,可以直接从顶点取position,顶点的position不是做了透视除法了吗?经过worldViewProjectionMatrix变换之后,顶点position应该位于NDC坐标空间,这个时候直接变换顶点position.xy到视口坐标空间应该就是视口的像素xy了。
https://github.com/jmecn/JSoftwareRenderer/blob/a86f2f11313f24fc9359e1190207ab66d888102a/src/main/java/net/jmecn/renderer/SoftwareRaster.java#L303-L305
https://github.com/jmecn/JSoftwareRenderer/blob/a86f2f11313f24fc9359e1190207ab66d888102a/src/main/java/net/jmecn/renderer/SoftwareRaster.java#L185-L201
从OpenGL对于视口的文档中,也没有要求对视口坐标应用透视除法: https://registry.khronos.org/OpenGL-Refpages/gl4/html/glViewport.xhtml
好吧,我忘了一件事,在worldViewProjectionMatrix变换之后,需要归一化才能到NDC。
我在写这段代码的时候,对于透视除法一直没有完全理解。到底应该在什么阶段除以w?把哪些东西除以w?后面再怎么处理? 我反复尝试之后发现在视口(viewportMatrix)变换后在除以w就正常了,具体出了什么问题我现在也没搞明白。整个程序突出一个思想:能跑就别碰它。如果你能教教我该怎么改正就最好啦。
另外,因为经过了视口变换,现在的position已经可以理解为显示设备上的像素坐标,因此才可以直接使用y。因为平顶、平底情况下插值得到的y是相等的。
大概就是:
Vclip = worldViewProjectionMatrix * Vmodel
Vndc = (Vclip.x / Vclip.w, Vclip.y / Vclip.w, Vclip.z / Vclip.w, 1 / Vclip.w)
Vwindow = viewportMatrix * Vndc
我也是一个希望在Java实现软件渲染器的初学者,目前还是没有找到为什么模型会变形的原因,此外,该程序中的Sutherland-Hodgman多边形裁剪功能也有问题,不过我不打算在我的程序中实现它。
现在看来顺序似乎反了,但确又能一定程度上的工作,令人困惑。