参考教程
Tutorial 30: Multiple Point Lights
学习记录
这篇文章中我们将介绍点光源的以及实现多个点光源渲染平面。本次的框架如下:
这次的内容比较简单,我们首先修改 LightClass
,将其改为保存有点光源坐标和颜色的数据类:
1 | //////////////////////////////////////////////////////////////////////////////// |
这只是一个用来保存数据的类,实现暂且不贴出来了。接下来看我们的 LightShaderClass
:
1 | const int NUM_LIGHTS = 4; |
我们新增加了两个结构体,LightColorBufferType
用来保存光颜色,LightPositionBufferType
用来保存光位置。需要注意到的是我们的 Render
,SetShaderParameters
的参数修改为需要接受两个 FLOAT4
数组,用来向光颜色数组和光位置数组传值。
在 InitializeShader
方法中,这次我们要创建 matrixBuffer
,lightColorBuffer
,lightPositionBuffer
三个缓冲区,其中 matrixBuffer
和 lightPositionBuffer
两个将传给顶点着色器, lightColorBuffer
传给像素着色器。其实现如下(只列出部分):
1 | bool LightShaderClass::InitializeShader(ID3D11Device* device, HWND hwnd, CHAR* vsFilename, CHAR* psFilename) |
在 SetShaderParameters
中,我们动态的为其赋值:
1 | bool LightShaderClass::SetShaderParameters(ID3D11DeviceContext* deviceContext, DirectX::XMMATRIX worldMatrix, DirectX::XMMATRIX viewMatrix, |
在对应的着色器代码中,我们在顶点着色器中对光源坐标进行变换:
1 | ///////////// |
像素着色器中我们使用四个光混合进行计算最终颜色:
1 | ///////////// |
最后,修改我们的 GraphicsClass
,成员变量新加入了四个光源对象:
1 | //////////////////////////////////////////////////////////////////////////////// |
在 Initialize
中初始化 light 对象:
1 | bool GraphicsClass::Initialize(int screenWidth, int screenHeight, HWND hwnd) |
在 Render
里进行渲染:
1 | bool GraphicsClass::Render() |
最终效果如下: