Graphics &引用;“低水平”;三维图形编程

Graphics &引用;“低水平”;三维图形编程,graphics,3d,language-agnostic,Graphics,3d,Language Agnostic,我想学习自下而上编程3D图形的基础知识。我现在不一定要学习DirectX或OpenGL,但要真正了解表面下的情况。我想从实现一个基本的光线跟踪器开始。这似乎很简单,甚至有在线教程 在此之后,我想在DirectX或OpenGL之外的软件中实现一个图形管道。这是可能的还是我会试图穿过一堵砖墙。他们说最好的学习方法是实践。3D图形是一个很大的领域,要回答你的问题确实需要更多关于你的目标的信息 编写光线跟踪器绝对是学习一些3D图形基础知识的好方法。DirectX和OpenGL当然是为了与基于光栅化的3D

我想学习自下而上编程3D图形的基础知识。我现在不一定要学习DirectX或OpenGL,但要真正了解表面下的情况。我想从实现一个基本的光线跟踪器开始。这似乎很简单,甚至有在线教程


在此之后,我想在DirectX或OpenGL之外的软件中实现一个图形管道。这是可能的还是我会试图穿过一堵砖墙。他们说最好的学习方法是实践。

3D图形是一个很大的领域,要回答你的问题确实需要更多关于你的目标的信息

编写光线跟踪器绝对是学习一些3D图形基础知识的好方法。DirectX和OpenGL当然是为了与基于光栅化的3D渲染的硬件加速器对话而设计的,因此,如果您真的想了解3D图形卡如何在屏幕上生成三角形图像,那么编写软件光栅化器将是一个很好的练习

如果你更感兴趣的是如何渲染3D场景的真实图像的基本原理,那么我不建议你关注编写光栅化器的细节。相反,我会专注于学习更多关于照明、着色、阴影、反射和折射以及全局照明的知识。所有这些都可以在软件光线跟踪器中相对直接地实现,大部分复杂性来自于试图使其高效,而不是基本原则


如果你的目标是更多地了解3D硬件如何在低层次上工作,那这就是它自己的另一个大主题。有很好的资源可以了解这一点,但如果这是你的目标,那么编写软件raytracer不一定会有帮助。

首先回顾一下你的矩阵。我想补充一点,我不想成为第二个John Carmack,但是,有没有现代书籍解释了现代图形管道背后的数学和低级概念。我知道最近随着使用着色器的可编程管道的引入,情况发生了变化。我认为最“现代”的描述应该是最新的DX/OGL规范。如果你对幕后的数学更感兴趣,那么“现代”的DX/OGL书可能不是你想要的,因为它从一段时间以来就是同一个数学。如果你想探索如何使用自己的引擎,这里有两本书非常好:DirectX和OpenGL是否只是管理你的图形卡,或者它是否为你做了一些工作,比如从不同的坐标系进行传输,等等。。。我想做所有的事情,这样我就知道它是如何工作的。回到固定函数图形API的前着色器时代,DirectX和OpenGL为您做了一些变换和照明工作。现在,主要由您在顶点和像素着色器中执行所有这些操作。现在OpenGL和Direct3D大多只处理与图形卡的对话、一些资源管理和同步,以及着色器代码的编译。所以随着它们的发展,它们“删除”了一些功能?(我知道随着图形卡变得越来越复杂,它们变得越来越复杂)。你可以说它们“删除”了功能,但实际上这些功能只是变得多余,给API增加了混乱。OpenGL实际上并没有完全取消对固定函数的支持,它只是被弃用了。固定功能变换和照明的问题在于它是“固定的”——您被一组特定的有限选项所束缚,用于进行变换、照明和着色,这限制了您可以实现的结果的种类和质量。有人试图使“固定”管道更具可配置性,但这很快变得比编写着色器更复杂。