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 Sí.
- 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 |