认怂声明:该项目仅为本人学习图形学所用,本著能用就行的思想开发

视频封面

00:14

前言

离高考还有两个多月,静下心来看看rtr4,写个软渲染练习,顺便尝试在c#管理内存。说实话这玩意多少人都做过了,比如这个:C++控制台可以写出什么样的厉害的游戏? 所以造轮子?不存在的

TODO List

  1. 实现大多数常用渲染模型及流水,rtr读到哪写到哪
  2. 伪Shader支持,类似于ShaderLab的语法
  3. 支持SIMD,需要.net core 3.0及以上
  4. 消除不必要的alloc,随著.net提供操作底层的途径,这一步有望实现
  5. ...

正文

该项目地址:

Jacks8n/CRender?

github.com图标

c#的Console类输出效果过于感人,所以采用winapi的方式,可以在ms doc查到详细信息就不展开了,有一点要注意的是CreateConsoleScreenBuffer()的dwFlag值在doc中是查不到的,需要在wincon.h中找到它的值为1

[DllImport("Kernel32.dll")]
private static extern IntPtr CreateConsoleScreenBuffer(uint dwDesiredAccess, uint dwShareMode, IntPtr lpSecurityAttributes, uint dwFlags, IntPtr lpScreenBufferData);

[DllImport("Kernel32.dll")]
private static extern bool WriteConsoleOutputCharacter(IntPtr hConsoleOutput, char[] lpCharacter, uint nLength, _COORD dwWriteCoord, out uint lpNumberOfCharsWritten);

[DllImport("Kernel32.dll")]
private static extern bool SetConsoleActiveScreenBuffer(IntPtr hConsoleOutput);

双缓冲什么的自然是必须,网上都有

为了实现方便的数值运算,有个操作,看

dotnet/coreclr?

github.com图标

if (typeof(T) == typeof(int))
int foo = (int)(object)bar;
else if ...

这类操作是会被优化的,所以搬过来放到GenericVector<T>了,实现shader中类似color0.rgb += color1.rgb的语法而避免使用delegate

再说下去就丢人了 为了不显得太low 本文到此终结


推荐阅读:
相关文章