不同对象的不同着色器DirectX 11


13

我正在学习Direct3D 11,在有关着色器编写的所有基本教程中,都编写了顶点着色器和像素着色器,因此它们以相同的方式变换整个场景。教程喜欢用纹理渲染立方体...

但我想知道,您如何区分对象?例如,如果要模拟某个对象上的镜面并使用不同的着色器来渲染场景的其余部分,该怎么办?我认为大多数游戏必须使用许多顶点和像素着色器才能实现各种外观和变换。

谢谢。

Answers:


23

是的,游戏引擎通常会具有各种不同的着色器。典型的模式是:

  1. 在初始化引擎并加载游戏世界时,请准备要用于渲染的所有着色器。“准备”是指将它们加载到内存中,如有必要,对其进行编译,并执行所有ID3D11Device::CreatePixelShader类似的调用以获取分配的D3D着色器对象并准备就绪。将对象保留在数组或其他数据结构中。

    通常,在顶点着色器和旨在共同工作的像素着色器之间将具有一对一的关系。我将它们视为单个对象,即使它确实包含一个顶点着色器和一个像素着色器(也可能包括几何/外壳/域着色器),我也将其称为“着色器”。

  2. 在找到要渲染的对象(网格)列表后,每帧均按着色器对其进行排序。这个想法是通过将所有具有给定着色器的对象绘制在一起,以最大程度地减少在帧中切换着色器的次数。这是因为切换着色器是一个有点昂贵的操作(虽然你当然可以做到每帧是几百或上千次,所以它不是真的贵)。

    实际上,您可以更进一步,首先按着色器对材质进行排序,然后对材质进行排序。“材料”是指着色器以及一组纹理和参数的组合。着色器通常具有一些纹理和数值参数(存储在常量缓冲区中),例如,砖材料和沥青材料可能使用相同的着色器代码,但纹理不同。

  3. 要进行绘制,只需循环遍历着色器,在中设置每个着色器ID3D11DeviceContext,设置任何参数(恒定缓冲区,纹理等),然后绘制对象。在伪代码中,包括着色器/材质区别,我提到:

    for each shader:
        // Set the device context to use this shader
        pContext->VSSetShader(shader.pVertexShader);
        pContext->PSSetShader(shader.pPixelShader);
    
        for each material that uses this shader:
            // Set the device context to use any constant buffers, textures, samplers,
            // etc. needed for this material
            pContext->VSSetConstantBuffers(...);
            pContext->PSSetConstantBuffers(...);
            pContext->PSSetShaderResources(...);
            pContext->PSSetSamplers(...);
    
            for each mesh that uses this material:
                // Set any constant buffers containing parameters specific to the mesh
                // (e.g. world matrix)
                pContext->VSSetConstantBuffers(...);
    
                // Set the context to use the vertex & index buffers for this mesh
                pContext->IASetInputLayout(mesh.pInputLayout);
                pContext->IASetVertexBuffers(...);
                pContext->IASetIndexBuffer(...);
                pContext->IASetPrimitiveTopology(...)
    
                // Draw it
                pContext->DrawIndexed(...)

关于管理对象,网格,着色器,输入布局,常量缓冲区等,还有很多要说的,但这足以让您入门。:)


您建议先按着色器排序,然后按材质排序。关于切换着色器与切换材料的成本,您是否有任何硬数据?哦,对于DX9,VS / PS组合称为“程序”。我不确定他们是否仍在DX11中使用该术语。
2013年

1
@PandaPajama这是一个很好的问题。不,我没有或不知道任何有关切换材料或着色器实际成本的最新度量。多年来,这种方法一直是“常识”,但是值得进行一些实际测量,以了解情况如何发生变化……如果可以的话,我会这样做。:)
内森·里德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.