Pavel's Blog

A good picture is equivalent to a good deed.

20. 纹理贴图(Texture Mapping)

3D Computer Graphics Programming

纹理采样(Texture Mapping) 缓存贴图 贴图类型定义 添加uv信息 typedef struct { float u; float v; }tex2_t; texcoord类型二维值(u,v) typedef struct { ...... tex2_t a_uv; tex2_t b_uv; tex2_t c...

19. 光影着色(Light and Shading)

3D Computer Graphics Programming

平面着色(Flat Shading) 平面着色指的是3D模型上每个多边形(通常是三角形)统一地着色。 平面着色编程 在light.h中新写一个类型结构体light_t内含一个三维向量表示平行光照方向。 typedef struct { vec3_t direction; }light_t; 引用light.c中的light extern light_t light; ...

原神甘雨渲染复刻

日式卡通角色渲染

最近面试也是经常被问到关于卡渲的知识,所以将一年前做的面向知乎的甘雨角色逆向复习了一下。 贴图解析 LightMap.r LightMap.g LightMap.b LightMap.a LightMap.r: 存储这区分材质的信息主要是高光类型:BlinPhong或者裁边视角光 LightMap.g: 存储着AO信息 LightMap.b: 存储BlinPho...

9. 三角形和顶点(Triangles and Vertices)

3D Computer Graphics Programming

三角面索引结构体 存储绘制三角面需要的三角形顶点索引值。 typedef struct { int a; int b; int c; } face_t; 在triangle.h中声明三角面结构体。 三角形结构体 存储屏幕空间三角形的三个顶点。 typedef struct { vec2_t points[3]; } triangle_t; ...

8. 固定时间步长(Fixed Time Step)

3D Computer Graphics Programming

SDL_Delay与Busy-Waiting方法 目的:实现固定时间步长,使每帧的更新时间间隔保持一致。 Busy-Waiting(忙等) void update(void) { while (!SDL_TICKS_PASSED(SDL_GetTicks(), previous_frame_time + FRAME_TARGET_TIME)); previous_f...

7. 线性变换(Linear Transformations)

3D Computer Graphics Programming

Sin角度加法和Cos角度加法公式推导 Sin(α+β) Cos(α+β) 2D旋转矩阵推导 通过2d旋转矩阵来理解旋转矩阵 为立方体添加旋转 vec3_t vec3_rotate_x(vec3_t v, float angle) { vec3_t roatated_vector = { .x = v.x, .y = v.y * c...

6. 点的投影(Projecting Points)

3D Computer Graphics Programming

投影有两种一种是正交投影一个是透视投影 正交投影 vec2_t project_orthographic(vec3_t point){ vec2_t projected_point = { .x = point.x, .y = point.y }; return projected_point; } 正交投影不考虑深度对结果的影...

5. 向量和点(Vectors and Points)

3D Computer Graphics Programming

向量 typedef struct { float x; float y; } vec2_t; typedef struct { float x; float y; float z; } vec3_t; 点云 //Declare an array of vectors/points const int N_POINTS = 9 * 9 *...

4. 多个头文件(Multiple Header Files)

3D Computer Graphics Programming

目录和内容 预处理指令保证文件只被包含一次。 .h文件 头文件通常用于声明,而不是定义。相当于目录。 声明函数,变量和数据结构 包含公共依赖 避免重复定义(#ifndef和#define) .c文件 实现文件用于定义函数和实现逻辑 实现头文件中声明的内容 模块内部的逻辑实现 控制模块的编译范围 为什么离.h和.c文件 模块化设计,使代...

3. SDL设置和颜色缓冲(SDL Setup and Color Buffer)

3D Computer Graphics Programming

1.Creating an SDL Window MacOS中无法找到SDL2库文件 通过pkg-config解决 安装pkg-config brew install pkg-config 在macos使用pkg-config来获取SDL2的编译和链接选项 gcc -Wall -std=c99 $(pkg-config --cflags sdl2) -o renderer ma...