Share via


Función D3DCompile2 (d3dcompiler.h)

Compila el código del lenguaje de sombreador de alto nivel (HLSL) de Microsoft en código de bytes para un destino determinado.

Sintaxis

HRESULT D3DCompile2(
  [in]            LPCVOID                pSrcData,
  [in]            SIZE_T                 SrcDataSize,
  [in, optional]  LPCSTR                 pSourceName,
  [in, optional]  const D3D_SHADER_MACRO *pDefines,
  [in, optional]  ID3DInclude            *pInclude,
  [in]            LPCSTR                 pEntrypoint,
  [in]            LPCSTR                 pTarget,
  [in]            UINT                   Flags1,
  [in]            UINT                   Flags2,
  [in]            UINT                   SecondaryDataFlags,
  [in, optional]  LPCVOID                pSecondaryData,
  [in]            SIZE_T                 SecondaryDataSize,
  [out]           ID3DBlob               **ppCode,
  [out, optional] ID3DBlob               **ppErrorMsgs
);

Parámetros

[in] pSrcData

Tipo: LPCVOID

Puntero a datos de sombreador no compilados (código ASCII HLSL).

[in] SrcDataSize

Tipo: SIZE_T

Tamaño, en bytes, del bloque de memoria al que apunta pSrcData .

[in, optional] pSourceName

Tipo: LPCSTR

Puntero opcional a una cadena terminada en null constante que contiene el nombre que identifica los datos de origen que se van a usar en los mensajes de error. Si no se usa, establezca en NULL.

[in, optional] pDefines

Tipo: const D3D_SHADER_MACRO*

Matriz opcional de estructuras de D3D_SHADER_MACRO que definen macros de sombreador. Cada definición de macro contiene un nombre y una definición terminada en NULL. Si no se usa, establezca en NULL. La última estructura de la matriz actúa como terminador y debe tener todos los miembros establecidos en NULL.

[in, optional] pInclude

Tipo: ID3DInclude*

Puntero a una interfaz ID3DInclude que el compilador usa para controlar los archivos de inclusión. Si establece este parámetro en NULL y el sombreador contiene un #include, se produce un error de compilación. Puede pasar la macro D3D_COMPILE_STANDARD_FILE_INCLUDE , que es un puntero a un controlador de inclusión predeterminado. Este controlador de inclusión predeterminado incluye archivos relativos al directorio actual y a los archivos que son relativos al directorio del archivo de origen inicial. Al usar D3D_COMPILE_STANDARD_FILE_INCLUDE, debe especificar el nombre del archivo de origen en el parámetro pSourceName ; el compilador derivará el directorio relativo inicial de pSourceName.

#define D3D_COMPILE_STANDARD_FILE_INCLUDE ((ID3DInclude*)(UINT_PTR)1)

[in] pEntrypoint

Tipo: LPCSTR

Puntero a una cadena terminada en null constante que contiene el nombre de la función de punto de entrada del sombreador donde comienza la ejecución del sombreador. Al compilar un efecto, D3DCompile2 omite pEntrypoint; se recomienda establecer pEntrypoint en NULL porque es una buena práctica de programación establecer un parámetro de puntero en NULL si la función llamada no la usará.

[in] pTarget

Tipo: LPCSTR

Puntero a una cadena terminada en null constante que especifica el destino del sombreador o el conjunto de características de sombreador con las que se va a compilar. El destino del sombreador puede ser un modelo de sombreador (por ejemplo, modelo de sombreador 2, modelo de sombreador 3, modelo de sombreador 4 o modelo de sombreador 5). El destino también puede ser un tipo de efecto (por ejemplo, fx_4_1). Para obtener información sobre los destinos que admiten varios perfiles, vea Especificar destinos del compilador.

[in] Flags1

Tipo: UINT

Combinación de constantes de compilación D3D del sombreador que se combinan mediante una operación OR bit a bit. El valor resultante especifica cómo compila el compilador el código HLSL.

[in] Flags2

Tipo: UINT

Combinación de constantes de efecto de compilación D3D que se combinan mediante una operación OR bit a bit. El valor resultante especifica cómo compila el compilador el efecto. Al compilar un sombreador y no un archivo de efecto, D3DCompile2 omite Flags2; Se recomienda establecer Flags2 en cero porque es una buena práctica de programación establecer un parámetro que no sea de puntero en cero si la función llamada no la usará.

[in] SecondaryDataFlags

Tipo: UINT

Combinación de las marcas siguientes que se combinan mediante una operación OR bit a bit. El valor resultante especifica cómo compila el compilador el código HLSL.

Marca Descripción
D3DCOMPILE_SECDATA_MERGE_UAV_SLOTS (0x01) Combine ranuras de vista de acceso sin ordenar (UAV) en los datos secundarios a los que apunta el parámetro pSecondaryData .
D3DCOMPILE_SECDATA_PRESERVE_TEMPLATE_SLOTS (0x02) Conserve las ranuras de plantilla en los datos secundarios a los que apunta el parámetro pSecondaryData .
D3DCOMPILE_SECDATA_REQUIRE_TEMPLATE_MATCH (0x04) Requerir que las plantillas de los datos secundarios que el parámetro pSecondaryData apunte a que coincidan cuando el compilador compila el código HLSL.

Si pSecondaryData es NULL, establezca en cero.

[in, optional] pSecondaryData

Tipo: LPCVOID

Puntero a datos secundarios. Si no pasa datos secundarios, establezca en NULL. Use estos datos secundarios para alinear ranuras UAV en dos sombreadores. Supongamos que el sombreador A tiene UAV y están enlazados a algunas ranuras. Para compilar el sombreador B de modo que las UAV con los mismos nombres se asignan en B a las mismas ranuras que en A, pase el código de bytes de A a D3DCompile2 como los datos secundarios.

[in] SecondaryDataSize

Tipo: SIZE_T

Tamaño, en bytes, del bloque de memoria al que apunta pSecondaryData . Si pSecondaryData es NULL, establezca en cero.

[out] ppCode

Tipo: ID3DBlob**

Puntero a una variable que recibe un puntero a la interfaz ID3DBlob que puede usar para acceder al código compilado.

[out, optional] ppErrorMsgs

Tipo: ID3DBlob**

Puntero a una variable que recibe un puntero a la interfaz ID3DBlob que puede usar para acceder a los mensajes de error del compilador o NULL si no hay errores.

Valor devuelto

Tipo: HRESULT

Devuelve uno de los códigos de retorno de Direct3D 11.

Comentarios

La diferencia entre D3DCompile2 y D3DCompile es que D3DCompile2 toma algunos parámetros opcionales (SecondaryDataFlags, pSecondaryData y SecondaryDataSize) que se pueden usar para controlar algunos aspectos de cómo se genera el código de bytes. Consulte las descripciones de estos parámetros para obtener más detalles. De lo contrario, no hay ninguna diferencia en la eficacia del código de bytes generado entre D3DCompile2 y D3DCompile.

Compilación de sombreadores para UWP

Para compilar sombreadores sin conexión, el enfoque recomendado es usar la herramienta Effect-compiler. Si no puede compilar todos los sombreadores con antelación, considere la posibilidad de compilar los más caros y los que requieren las rutas de acceso de inicio y la mayoría de las rutas de acceso sensibles al rendimiento y compilar el resto en tiempo de ejecución. Puedes usar un proceso similar al siguiente para compilar un sombreador cargado o generado en una aplicación para UWP sin bloquear el subproceso de la interfaz de usuario.

  • Con Visual Studio 2015 y versiones posteriores para desarrollar la aplicación para UWP, agregue el nuevo elemento "shader.hlsl".

    • En la vista Carpeta de soluciones de Visual Studio, seleccione el elemento shaders.hlsl y haga clic con el botón derecho en Propiedades.
    • Asegúrese de que el elemento Contenido está establecido en .
    • Asegúrese de que el tipo de elemento está establecido en Texto.
    • Agregue un botón a XAML, asígnele el nombre ("TheButton" en este ejemplo) y agregue un controlador Click .
  • Ahora agregue estas inclusión al archivo .cpp:

    #include <ppltasks.h>
    #include <d3dcompiler.h>
    #include <Robuffer.h>
    
  • Use el código siguiente para llamar a D3DCompile2. Tenga en cuenta que no hay ninguna comprobación o control de errores aquí, y también que este código demuestra que puede realizar E/S y compilación en segundo plano, lo que deja la interfaz de usuario con mayor capacidad de respuesta.

void App1::DirectXPage::TheButton_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
  std::shared_ptr<Microsoft::WRL::ComPtr<ID3DBlob>> blobRef = std::make_shared<Microsoft::WRL::ComPtr<ID3DBlob>>();

  // Load a file and compile it.
  auto fileOp = Windows::ApplicationModel::Package::Current->InstalledLocation->GetFileAsync(L"shader.hlsl");
  create_task(fileOp).then([this](Windows::Storage::StorageFile^ file) -> IAsyncOperation<Windows::Storage::Streams::IBuffer^>^
  {
    // Do file I/O in background thread (use_arbitrary).
    return Windows::Storage::FileIO::ReadBufferAsync(file);
  }, task_continuation_context::use_arbitrary())
    .then([this, blobRef](Windows::Storage::Streams::IBuffer^ buffer)
  {
    // Do compilation in background thread (use_arbitrary).

    // Cast to Object^, then to its underlying IInspectable interface.
    Microsoft::WRL::ComPtr<IInspectable> insp(reinterpret_cast<IInspectable*>(buffer));

    // Query the IBufferByteAccess interface.
    Microsoft::WRL::ComPtr<Windows::Storage::Streams::IBufferByteAccess> bufferByteAccess;
    insp.As(&bufferByteAccess);

    // Retrieve the buffer data.
    byte *pBytes = nullptr;
    bufferByteAccess->Buffer(&pBytes);

    Microsoft::WRL::ComPtr<ID3DBlob> blob;
    Microsoft::WRL::ComPtr<ID3DBlob> errMsgs;
    D3DCompile2(pBytes, buffer->Length, "shader.hlsl", nullptr, nullptr, "main", "ps_5_0", 0, 0, 0, nullptr, 0, blob.GetAddressOf(), errMsgs.GetAddressOf());
    *blobRef = blob;
  }, task_continuation_context::use_arbitrary())
    .then([this, blobRef]()
  {
    // Update UI / use shader on foreground thread.
    wchar_t message[40];
    swprintf_s(message, L"blob is %u bytes long", (unsigned)(*blobRef)->GetBufferSize());
    this->TheButton->Content = ref new Platform::String(message);
  }, task_continuation_context::use_current());
}

Requisitos

Requisito Value
Plataforma de destino Windows
Encabezado d3dcompiler.h
Library D3DCompiler.lib
Archivo DLL D3DCompiler_47.dll

Vea también