C#写个控制台软渲染
认怂声明:该项目仅为本人学习图形学所用,本著能用就行的思想开发
00:14前言
离高考还有两个多月,静下心来看看rtr4,写个软渲染练习,顺便尝试在c#管理内存。说实话这玩意多少人都做过了,比如这个:C++控制台可以写出什么样的厉害的游戏? 所以造轮子?不存在的
TODO List
- 实现大多数常用渲染模型及流水,rtr读到哪写到哪
- 伪Shader支持,类似于ShaderLab的语法
- 支持SIMD,需要.net core 3.0及以上
- 消除不必要的alloc,随著.net提供操作底层的途径,这一步有望实现
- ...
正文
该项目地址:
Jacks8n/CRender
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
if (typeof(T) == typeof(int))
int foo = (int)(object)bar;
else if ...
这类操作是会被优化的,所以搬过来放到GenericVector<T>了,实现shader中类似color0.rgb += color1.rgb的语法而避免使用delegate
再说下去就丢人了 为了不显得太low 本文到此终结
推荐阅读: