在现代图形引擎中图形管线经历了由固定管线到可编程管线的发展,所以DX、OpenGL早期版本可以在固定管线下直接调用相关API设置着色模式为Flat shading。
- 以DirectX9中开启Flat shading为例:
Device->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT);
- 以OpenGL旧版本中开启Flat shading为例:
glShadeModel(GL_FLAT);
但是目前这些图形引擎(DX10/11/12、OpenGL 4.0、Vulkan)发展出了可编程管线,所以直接调API设置的传统方式废除了,转变成了在变量前添加限定符nointerpolation(hlsl)或flat(glsl)来取消插值,从而开启Flat shading。
- 以hlsl写的着色器举例:
// 在vertex shader中:
struct VS_TO_PS
{
float4 Pos:SV_Position;
nointerpolation float3 normal:NORMAL;
float2 TexCoord:TEXCOORD0;
};
// 在pixel shader中
struct VS_TO_PS
{
float4 Pos:SV_Position;
nointerpolation float3 normal:NORMAL;
float2 TexCoord:TEXCOORD0;
};
glsl写的着色器类似,只不过是在变量前加flat修饰。