如何在directX 11中将SHADEMODE设置为D3DSHADE_FLAT

时间:2013-04-14 18:20:48

标签: directx-11

在DirectX 9中 g_d3dDevice-> SetRenderState(D3DRS_SHADEMODE,D3DSHADE_FLAT); 那dx11的API怎么样

感谢

////////更新1 ///////

顶点/像素清晰度和光线根本不会产生效果。 例如。 3 vectex红色,绿色,蓝色。 如果打开FLAT ode,它会用第一种颜色填充所有三角形,如果是SMOOTH模式,你将使用Gouraud Shading获得一个彩色三角形。

在顶点锐化中我得到了顶点颜色。

在像素清晰度中,我得到了像素颜色,但已经插值。

没有光没有正常信息,这是一个2d程序。

并且我没有要求用相同颜色填充三角形的方法。我只找到使用FLAT SHADEMODE的方法。

////////更新2 ///////

struct VertexShaderInput
{
    float2 pos : POSITION;
    float4 color : COLOR0;
};

struct VertexShaderOutput
{
    float4 pos : SV_POSITION;
    nointerpolation float4 color : COLOR0;
};

但它也在使用Gouraud Shading。

////////更新3 ///////

我找到了一个主题

http://www.gamedev.net/topic/621313-directx11-and-smooth-shading 作者说:“我没有激活Blender中的平滑阴影” 但我在Blender中找不到关键字

2 个答案:

答案 0 :(得分:3)

您可以在顶点数据上使用 nointerpolation 修饰符来完成此操作。

struct VS_OUTPUT_AND_PS_INPUT
{
    float4 f4Position : SV_POSITION;    
    nointerpolation float3 f3WorldNormal : NORMAL;
};

您还可以对任何顶点数据使用 nointerpolation 以获得有趣的结果。

答案 1 :(得分:0)

如果我没弄错的话,你要求的是固定功能管道。在DirectX 11中,所有即时模式渲染,固定功能管道的东西都被彻底抛弃了窗口(你仍然可以在旧版本的OpenGL和旧版本的DirectX中获得它,但你想要闪亮的新DirectX 11)。现在如何绘制内容的方法是编写HLSL shaders,然后通过ID3D11Buffer* and the related APIs将其存储在顶点缓冲区中。然后,您可以调用设备上下文的DrawIndexedDraw函数。

这是一个非常大的变化,从固定管道的东西和旧的OpenGL和旧的DirectX的硬状态机。

如果您关注this tutorial,可能会有所帮助。它将为您提供一个良好的起点,如果您了解C ++ 11,您甚至可以使用std::unique_ptr来清理许多奇怪的指针。

修改 我提到固定功能管道的原因是因为SHADEMODE用于由GPU上的固定功能管道执行的照明计算。因为您正在编写自己的HLSL着色器来绘制内容,所以您无法设置“着色模式”。而是通过编写自己的HLSL着色器来定义自己的阴影模式。我不确定你是否还在考虑使用DX11进行固定功能管道编程,所以我确保在这个答案中尽可能包容。

短版:不存在,不要打扰。可以通过编写自己的着色器遵守光和物理定律many of which have been done before and simplified and explained for your use来实现平滑/平滑着色。 祝你好运!