2017-08-26 8 views
0

Je modifie un shader HLSL utilisé dans D3D12 pour compiler vers SPIR-V parce que je veux utiliser le même code de shader dans Vulkan. Voici le shader:Modification d'un shader HLSL pour travailler dans Vulkan, dois-je séparer les textures/samplers?

#if !VULKAN 
#define layout(a) 
#else 
#define register(a) blank 
#endif 

struct VSOutput 
{ 
    float4 pos : SV_Position; 
    float2 uv : TEXCOORD; 
    float4 color : COLOR; 
}; 

layout(binding=1) Texture2D<float4> tex : register(t0); 
layout(binding=1) SamplerState sLinear : register(s0); 

float4 main(VSOutput vsOut) : SV_Target 
{ 
    return tex.SampleLevel(sLinear, vsOut.uv, 0) * vsOut.color; 
}; 

Puis-je utiliser la même liaison pour les textures et sampler si mon descripteur défini à l'index 1 est de type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER ou dois-je utiliser deux emplacements de liaison, l'un pour la texture et un pour l'échantillonneur? Je demande parce que ma création de pipeline échoue avec l'erreur

avertissement Vulkan: [ParameterValidation], code: 9: vkCreateGraphicsPipelines: retour VK_ERROR_INITIALIZATION_FAILED, indiquant que l'initialisation d'un objet a échoué

si utiliser ce shader au lieu d'un shader GLSL compilé dans SPIR-V. Mon shader GLSL utilise la texture comme ceci:

layout (binding = 1) uniform sampler2D textureMap; 
+1

La création de pipeline échoue-t-elle réellement ou seules les couches de validation se plaignent-elles de l'échec? Peut-être que l'échantillonneur d'images combiné n'est pas un problème? – Ekzuzy

+0

@Ekzuzy Il échoue également sans couches de validation, alors peut-être que le problème est ailleurs. – SurvivalMachine

+0

Pour référence future, j'ai découvert que ma création PSO avec ce shader HLSL échoue sur AMD (pilote 17.8.2) mais fonctionne sur NVIDIA. Peut-être que c'est un bug avec le pilote AMD. – SurvivalMachine

Répondre

1

En ce qui SPIR-V et Vulkan sont concernés, l'équivalent SPIR-V devrait fonctionner. Autrement dit, vous pouvez avoir une variable d'image et une variable d'échantillonnage, à la fois lié à la même liaison, et utiliser COMBINED_IMAGE_SAMPLER dessus:

VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER entrées de jeu de descripteurs peuvent également être accessibles via sampler séparés et variables de shaders d'image échantillonnées.

et:

Il est valable pour plusieurs variables de shaders à attribuer le même descripteur ensemble et les valeurs de liaison, tant que tous ceux qui sont statiquement utilisés par le point d'entrée en cours de compilation sont compatibles avec le type de descripteur dans la liaison de présentation de l'ensemble descripteur.

Les types de descripteurs image/échantillonneur combinés sont compatibles avec les images et les échantillonneurs. Bien sûr, cela ne signifie pas que la couche de validation que vous utilisez le sait;) Notez que la dernière citation provient d'une clarification récente apportée à la spécification, donc les couches peuvent ne pas l'avoir implémentée correctement.

Je suggérerais, si votre code est correct, de produire un rapport de bogue.


layout (binding = 1) uniform sampler2D textureMap; 

Il est toujours une bonne idée de préciser set aussi bien. KHR_vulkan_glsl utilise par défaut 0, mais il vaut mieux avoir une instruction explicite.

-1

Si vous utilisez un échantillonneur d'images combinées, vous devez utiliser une liaison. Mais vous devez définir à la fois nombre défini et le numéro de liaison par la qualification de mise en page:

layout(set=S, binding=B) ... 

Here est un exemple d'utilisation d'un échantillonneur d'image combinée. Si vous le souhaitez, vous pouvez également utiliser des échantillonneurs séparés et des objets image échantillonnés. Vous devez ensuite les définir dans deux liaisons distinctes et utiliser deux descripteurs.Mais le descripteur d'échantillonneur d'images combiné peut avoir de meilleures performances sur certaines plates-formes.