Organizar el estado en un efecto (Direct3D 10)
Con Direct3D 10, el estado de efecto para determinadas fases de canalización se organiza mediante las estructuras siguientes:
Estado de la canalización | Estructura |
---|---|
Ensamblador de entrada | D3D10_INPUT_ELEMENT_DESC |
Rasterización | D3D10_RASTERIZER_DESC |
Fusión de salida | D3D10_BLEND_DESC y D3D10_DEPTH_STENCIL_DESC |
Para las fases del sombreador, donde el número de cambios de estado debe controlarse más mediante una aplicación, el estado se ha dividido en estado de búfer constante, estado de muestreo y estado de recurso del sombreador. Esto permite que una aplicación que esté cuidadosamente diseñada para actualizar solo el estado que está cambiando, lo que mejora el rendimiento al reducir la cantidad de datos que se deben pasar a la GPU.
¿Cómo se organiza el estado de la canalización en un efecto?
La respuesta es que el orden no importa. Las variables globales no tienen que ubicarse en la parte superior. Sin embargo, todos los ejemplos del SDK siguen el mismo orden, ya que es recomendable organizar los datos de la misma manera. Por lo tanto, se trata de una breve descripción del orden de datos en los ejemplos del SDK de DirectX.
Variables globales
Al igual que la práctica estándar de C, las variables globales se declaran primero, en la parte superior del archivo. A menudo, son variables que se inicializarán mediante una aplicación y, a continuación, se usarán en un efecto. A veces se inicializan y nunca cambian, otras veces se actualizan todos los fotogramas. Al igual que las reglas de ámbito de función de C, las variables de efecto declaradas fuera del ámbito de las funciones de efecto son visibles en todo el efecto; cualquier variable declarada dentro de una función de efecto solo es visible dentro de esa función.
Este es un ejemplo de las variables declaradas en BasicHLSL10.fx.
// Global variables
float4 g_MaterialAmbientColor; // Material's ambient color
Texture2D g_MeshTexture; // Color texture for mesh
float g_fTime; // App's time in seconds
float4x4 g_mWorld; // World matrix for object
float4x4 g_mWorldViewProjection; // World * View * Projection matrix
// Texture samplers
SamplerState MeshTextureSampler
{
Filter = MIN_MAG_MIP_LINEAR;
AddressU = Wrap;
AddressV = Wrap;
};
La sintaxis de las variables de efecto se detalla más detalladamente en Sintaxis de variable de efecto (Direct3D 10). La sintaxis de los muestreadores de texturas de efecto es más detallada en Sampler Type (DirectX HLSL).
Sombreadores
Los sombreadores son programas ejecutables pequeños. Puede pensar en sombreadores como encapsular el estado del sombreador, ya que el código HLSL implementa la funcionalidad del sombreador. La canalización usa tres tipos diferentes de sombreadores.
- Sombreadores de vértices: funciona en datos de vértices. Un vértice en produce un vértice fuera.
- Sombreadores de geometría: funcionan en datos primitivos. Un primitivo en puede producir 0, 1 o muchos primitivos fuera.
- Sombreadores de píxeles: funcionan en datos de píxeles. Un píxel en produce 1 píxel fuera (a menos que el píxel se seleccione fuera de una representación).
Los sombreadores son funciones locales y siguen las reglas de función de estilo C. Cuando se compila un efecto, cada sombreador se compila y un puntero a cada función de sombreador se almacena internamente. Cuando la compilación se realiza correctamente, se devuelve una interfaz ID3D10Effect. En este punto, el efecto compilado está en un formato intermedio.
Para obtener más información sobre los sombreadores compilados, deberá usar la reflexión del sombreador. Esto es básicamente como pedir al tiempo de ejecución que descompile los sombreadores y devolver información sobre el código del sombreador.
struct VS_OUTPUT
{
float4 Position : SV_POSITION; // vertex position
float4 Diffuse : COLOR0; // vertex diffuse color
float2 TextureUV : TEXCOORD0; // vertex texture coords
};
VS_OUTPUT RenderSceneVS( float4 vPos : POSITION,
float3 vNormal : NORMAL,
float2 vTexCoord0 : TEXCOORD,
uniform int nNumLights,
uniform bool bTexture,
uniform bool bAnimate )
{
VS_OUTPUT Output;
float3 vNormalWorldSpace;
....
return Output;
}
struct PS_OUTPUT
{
float4 RGBColor : SV_Target; // Pixel color
};
PS_OUTPUT RenderScenePS( VS_OUTPUT In,
uniform bool bTexture )
{
PS_OUTPUT Output;
if( bTexture )
Output.RGBColor = g_MeshTexture.Sample(MeshTextureSampler, In.TextureUV) * In.Diffuse;
....
return Output;
}
La sintaxis de los sombreadores de efectos es más detallada en Sintaxis de función de efecto (Direct3D 10) .
Técnicas y pases
Una técnica es una colección de pasos de representación (debe haber al menos un pase). Cada paso de efecto (que es similar en el ámbito a un único paso en un bucle render) define el estado del sombreador y cualquier otro estado de canalización necesario para representar la geometría.
Este es un ejemplo de una técnica (que incluye un paso) de BasicHLSL10.fx.
technique10 RenderSceneWithTexture1Light
{
pass P0
{
SetVertexShader( CompileShader( vs_4_0, RenderSceneVS( 1, true, true ) ) );
SetGeometryShader( NULL );
SetPixelShader( CompileShader( ps_4_0, RenderScenePS( true ) ) );
}
}
La sintaxis de los sombreadores de efectos es más detallada en Sintaxis de técnica de efecto (Direct3D 10).
Temas relacionados