参考教程
学习记录
这篇文章中,我们将基于上一篇的内容加一点扩展,为凹凸贴图实现的效果再加上镜面反射。关于镜面反射在 OpenGL 学习笔记中有介绍过:【OpenGL】11-光照 。这一篇文章则是简单的介绍在使用贴图的情况下实现。
这一篇内容比较少,因为我们只需要更改着色器代码就可以了。首先我们更新一下我们的贴图。这一次将使用新的图片(在文末的源代码链接可以找到)。
在这里我们只需要对着色器代码进行修改,首先在顶点着色器中我们需要一个摄像机坐标,这里我们直接在着色器里写入我们当前的摄像机位置:
1 | float3 cameraPos = float3(1.0f, 1.0f, -1.0f); |
同时我们需要得到与世界变换矩阵变换后的坐标:
1 | float4 worldPosition; |
我们在 pixelInputType
结构体里也新增了视野方向变量 ,并且在顶点着色器里进行计算,传给像素着色器:
1 | worldPosition = mul(input.pos, world); |
顶点着色器的完整代码如下:
1 | cbuffer ConstantBuffer : register(b0) { |
在片段着色器里,我们为了更好的显示效果,将光源方向修改了一下,变成了正对 z 轴,它的反方向就成了正对 z 负轴。
1 | lightDir = normalize(float3(0.0f, 0.0f, 1.0f)); |
片段着色前前边的代码与上一篇一样,而当法线与光照反向量的点乘大于 0 的时候,即光能照到的时候,我们开始计算镜面反射。
1 | if (lightIntensity > 0.0f) { |
最后将颜色混合。
1 | return saturate(color + specular); |
像素着色器的完整代码如下:
1 | Texture2D tex[3]; |
最终效果如下:
这个效果很明显了吧。