程序化波浪:
通过在顶点着色器中,使用sin()函数和时间变量,对顶点的Y轴位置进行程序化偏移实现。
//顶点着色器里面进行扰动
float3 x_offset = sin(_Time.y * _Frequency) * _Amplitude;
float3 y_offset = sin(_Time.y * _Frequency + IN.positionOS.x * _WaveLength) * _Amplitude;
float3 modifiedPositionOS = IN.positionOS.xyz;
modifiedPositionOS.x += x_offset;
modifiedPositionOS.y += y_offset;
溶解特效:
通过采样噪声纹理,并以时间为变量,动态控制clip()函数的阈值达成。
//噪声贴图
half noiseValue = SAMPLE_TEXTURE2D(_NoiseMap, sampler_NoiseMap, parallax_uv).r;
half threshold = frac(_Time.y * _DissolveThreshold); // 用时间驱动
clip(noiseValue - threshold);
护盾效果:
基于菲涅尔反射公式、法线扰动贴图、时间参数偏差,实现能量护盾效果
//纹理流动效果
float2 scroll_offset = _ScrollSpeed.xy * _Time.y;
float2 final_uv = parallax_uv+ scroll_offset;
//纹理贴图
half4 albedo = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, final_uv);
软件光栅化器:
基于 GAMES101 教学内容独立实现。
包括三角形扫描、深度测试(Z-Buffer)、透视纹理映射、光照插值等基础功能。
代码:GAMES101/Assignment3/Code at main · chu123122/GAMES101
Blinn-Phong复刻:
在Unity中用HLSL绕过内置管线,手动实现了Blinn-Phong光照模型,包括漫反射、高光和环境光和纹理贴图、法线贴图和视差贴图。
左(视差贴图+法线贴图) 右(无光照)
//环境光计算
half3 ambient = SampleSH(normalWS);
//漫反射光计算
half3 diffuse = energy * saturate( dot(normalWS, light_direction));
//高光计算
half3 specular = energy * pow(saturate(dot(normalWS, h)), _Shininess);
half3 finalColor = (ambient + diffuse) * baseMapColor.rgb + specular;
多线程路径追踪:
基于蒙特卡洛积分方法的路径追踪渲染器, 实现了漫反射、镜面反射、全局光照与软阴影。
使用 std::thread 进行分块并行渲染以加速计算。
代码:GAMES101/PA7.1 at main · chu123122/GAMES101