图形学 日志

自制简易的软光栅渲染器(0)

playerzhou 无回复

项目地址:https://github.com/OmegaZhou/SimpleRenderer

前言

  • 在学完闫令琪老师的games101课程后,为检验这段时间自己的学习成果,于是就准备自己尝试制作一个软光栅渲染器,顺便巩固一下学习成果
  • 本项目同时参考了GitHub上的tinyrender项目,来逐步完成渲染器的核心功能,同时帮助我查缺补漏
  • 同时我也参考了相应的知乎问答,对整个光栅渲染器的结构设计有了一个初步的想法
  • 在实现本项目的技术选择上
    • 在我研究了一下Windows原生的桌面编程相关的API后,感觉太过繁琐,加上不想引入像QT这样比较重的库,因此我决定直接使用自己比较熟悉的HTML5的canvas作为渲染结果的展示平台,这样可以省去许多繁琐的工作
    • 同时,在本次项目中仅使用imageData来以像素为单位地直接操作canvas,从而避免使用canvas提供的相关绘制API
    • 在相关代码的编写上,我选择使用typescript来帮助我完成类型限制、优化编写类的体验,但为能够直接在文件系统中打开网页访问,我并没有采用模块化的方式将js代码导入HTML文件中,而是以传统方式将所有js文件导入HTML文件

准备工作

  • 首先我要完成的就是实现与canvas的直接交互工作,对其进行封装,这样在之后的编写过程中就可以不再与canvas直接打交道了
  • 根据习惯,我准备采用的是左下角为原点的坐标系,并定义了Color类,表示像素的RGB颜色,并在此基础上定义了存储Color的二维数组作为帧缓存frame_buffer
  • 在研究了canvas所使用的ImageData格式之后,我完成了从frame_bufferImageData的映射工作(包括了将我使用的左下角为原点的坐标系转换为ImageData使用的左上角为原点的坐标系),并封装为Frame类的成员函数showImage,将帧缓存导入canvas并显示
  • 这样准备工作就做好了,之后就不用再考虑有关canvas操作的相关问题了

来一发吐槽

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据