La mia domanda è simile a this one ma parte della risposta data (utile) non è compatibile con la compilazione GLSL per vulkan basato su ESPL ESSL 3.10 di OpenGL.Compilare GLSL scritto per OpenGL ES versioni per Vulkan
Per utilizzare una sezione separata della memoria costante di spinta nel vertex shader e nello shader di frammenti, la soluzione suggerita è di utilizzare il layout (offset = #) prima del primo membro della struttura costante di spinta.
Il tentativo di eseguire questa operazione nel codice GLSL ES 310 porta all'errore "'offset sul membro del blocco': non supportato con questo profilo: es".
Esiste un modo supportato per dichiarare tale offset compatibile con es?
L'unica soluzione che ho trovato è dichiarare un gruppo di variabili fittizie nello shader di frammenti. Quando lo faccio, ottengo errori di livello di convalida se non dichiaro l'intervallo completo del buffer di costante di push del frammento shader in VkPipelineLayoutCreateInfo. Dopo aver corretto ciò, ricevo avvisi di livello di convalida sulla "chiamata vkCreatePipelineLayout() ha costanti push con intervalli sovrapposti".
Ovviamente posso ignorare gli avvisi, ma se c'è una soluzione più ordinata, sarebbe molto più preferibile.
Semplice esempio, questo compila con successo con VulkanSDK \ 1.0.13.0 \ Bin \ glslangValidator.exe:
#version 430
#extension GL_ARB_enhanced_layouts: enable
layout(std140, push_constant) uniform PushConstants
{
layout(offset=64) mat4 matWorldViewProj;
} ubuf;
layout(location = 0) in vec4 i_Position;
void main() {
gl_Position = ubuf.matWorldViewProj * i_Position;
}
considerando che il presente non è così:
#version 310 es
#extension GL_ARB_enhanced_layouts: enable
layout(std140, push_constant) uniform PushConstants
{
layout(offset=64) mat4 matWorldViewProj;
} ubuf;
layout(location = 0) in vec4 i_Position;
void main() {
gl_Position = ubuf.matWorldViewProj * i_Position;
}
la conversione di tutti il mio codice 310 ES shader per 430 risolverebbe il mio problema, ma non sarebbe l'ideale. GL_ARB_enhanced_layouts non si applica al codice 310 ES, quindi la mia domanda non riguarda il motivo per cui non funziona, ma piuttosto, ho qualche opzione in ES per raggiungere lo stesso obiettivo?
"* Convertire tutto il mio codice shader 310 ES in 430 risolverebbe il mio problema, ma non sarebbe l'ideale. *" I tuoi shader sono scritti per essere consumati da * Vulkan *, non OpenGL ES. Quindi, perché non è "ideale" che devi apportare modifiche per far sì che funzioni? Perché sei collegato ai tuoi shader usando ES version 3.10? –
Dato che questa domanda continua ad avere visualizzazioni occasionali e upvotes, ho pensato di seguire. Mi rivolgo ai dispositivi mobili, compresi i dispositivi OpenGLES2 e Metal, e ho voluto utilizzare SPIR-V cross per compilare in cross-down un singolo set di shader su tutte le piattaforme di destinazione. Mi sono bloccato con 310 ES + GL_KHR_vulkan_glsl e ho hacked glslang e SPIRV-Cross per consentire entrambi gli offset di layout (per Vulkan) e lowp (per GLES2). Glslang e SPIRV-Cross sono entrambi open source e sono stati relativamente facili da modificare per soddisfare le mie esigenze: YMMV. – Columbo