GLSL - Reescrevendo shaders de # 330 a # 130

7

Recentemente, criei um jogo ( LD21 ) que usa um sombreador de geometria para converter pontos em triângulos texturizados / seleção. Como eu tinha a impressão de que o suporte ao nº 330 era generalizado, escrevi apenas shaders nº 330, mas parece que muito do hardware não tão antigo suporta apenas o nº 130 (de acordo com o GLView)

Agora, como estou familiarizado apenas com a funcionalidade principal # 330, estou tendo problemas para reescrever meus shaders para # 130. O shader de fragmento foi bastante trivial para reescrever, mas só consegui baixar meu shader de vértice e geometria para # 150.

Portanto, é possível reescrever os sombreadores ou exigiria muitas alterações no meu mecanismo de renderização?

Sombreador de geometria

#version 150
layout(points) in;
layout(triangle_strip, max_vertices = 4) out;
uniform mat4 oMatrix;
in VertexData
{
    vec4 position;
    vec4 texcoord;
    vec4 size;
} vert;

out vec2 gTexCoord;

void main()
{
    if(vert.position.x>-4f && vert.position.x<4f && vert.position.y>-2f && vert.position.y<2f)
    {
        gTexCoord=vec2(vert.texcoord.z,vert.texcoord.y);
        gl_Position = vert.position + vec4(vert.size.x,vert.size.y,0,0);
        EmitVertex();

        gTexCoord=vec2(vert.texcoord.x,vert.texcoord.y);
        gl_Position = vert.position + vec4(0.0,vert.size.y,0,0);
        EmitVertex();

        gTexCoord=vec2(vert.texcoord.z,vert.texcoord.w);
        gl_Position = vert.position + vec4(vert.size.x,0.0,0,0);
        EmitVertex();

        gTexCoord=vec2(vert.texcoord.x,vert.texcoord.w);
        gl_Position = vert.position;
        EmitVertex();

        EndPrimitive();
    }
}

Sombreador de vértice

#version 150
#extension GL_ARB_explicit_attrib_location : enable

layout (location = 0) in vec2 position;
layout (location = 1) in vec4 textureCoord;
layout (location = 2) in vec2 size;
uniform mat4 oMatrix;
uniform vec2 offset;
out VertexData
{
    vec4 position;
    vec4 texcoord;
    vec4 size;
} outData;

void main()
{
    outData.position = oMatrix * vec4(position.x+offset.x,position.y+offset.y,0,1);
    outData.texcoord = textureCoord;
    outData.size = oMatrix * vec4(size.x,size.y,0,0);
}
nilstastic
fonte
Não se esqueça de informar-se sobre os recursos de aceitação e votação antecipada.
Christian Rau
2
"Não se esqueça de se informar sobre os recursos de aceitação e votação antecipada". Leia: "Aceite minha resposta".
22411 Jonathan Connell
11
@ Jonathan não era para ser assim. Não é rude não aceitar se a resposta não foi de ajuda. Na verdade, o OP talvez tenha aceitado minha resposta muito rápido (desculpe por isso). Mas muitas vezes (mesmo em minha curta vida de SO), vejo visitantes únicos fazendo uma pergunta e depois a esquecendo completamente (talvez eles tenham resolvido a questão 3 minutos depois ou confundiram o site como um fórum). Mas o sistema de reputação é a força motriz deste site de perguntas e respostas orientado a comentários. Não era para aceitar imediatamente minha resposta sem pensar, mas como está escrito, para estar ciente do recurso de aceitação (como muitos novatos não são).
Christian Rau
@ Jonathan E, a propósito, eu já escrevi esses lembretes nas primeiras perguntas que não foram respondidas por mim. Mas você está certo, pois é um pouco interessado aqui.
Christian Rau
11
@ Christian Rau Isso às vezes acontece, embora seja provavelmente melhor dar às pessoas o benefício da dúvida. Se você quiser postar um comentário, "Bem-vindo, por favor leia as regras do site" seria mais apropriado IMO :) Ah, e um para a sua resposta;)
Jonathan Connell

Respostas:

5

Primeiro, você não poderá usar structs para variar dados (alterado em 1,50), mas ainda poderá usar ine, em outvez de attributee varying. Além disso, você deve escrever na variável interna gl_Positionno sombreador de vértices (alterado por 1,40). Portanto, no shader de vértice, substitua a declaração outDatapor algo semelhante a

out vec4 texcoord;
out vec4 vSize;       //size already used

e use em gl_Positionvez de outData.position.

Não tenho certeza se a extensão ARB_explicit_attrib_location já é essencial, então talvez você precise adicionar

#extension ARB_explicit_attrib_location : require

para usar a layoutsintaxe ou apenas definir os locais dos atributos no aplicativo chamando glBindAttribLocationantes de vincular o sombreador, se essa extensão não for suprimida.

No sombreador de geometria, altere a descentralização do vert para algo como

in vec4 texcoord[];      //names have to match vertex shader, of course
in vec4 vSize[];

Embora você obtenha apenas uma única entrada (como você está usando pontos), elas ainda precisam ser matrizes, eu acho (embora sempre indexe com [0], quando usado). Mude o uso de vert.positionpara gl_PositionIn[0].

Em seguida, acho que a layoutsintaxe para o sombreador de geometria foi introduzida na 1.50, portanto, talvez você precise definir o layout do sombreador de geometria no aplicativo por meio de glProgramParameteri.

Devo admitir que não tenho muita experiência prática com sombreadores de geometria ou com a sintaxe moderna, pois ainda uso o hardware 2.1, mas todas essas alterações podem ser deduzidas observando as respectivas especificações . Basta olhar para os logs de informações do sombreador se a compilação (ou o link) falhar em obter algumas dicas sobre o que pode estar errado.

A falta da layoutsintaxe no vértice e no sombreador de geometria são as únicas coisas que podem exigir algumas pequenas adições ao código do aplicativo, mas não tenho certeza absoluta se elas são realmente não supridas, então tente por último.

Além disso, fique à vontade para atualizar sua pergunta se eu perder alguma coisa e os shaders ainda não funcionarem, talvez desta vez com algumas mensagens de erro do compilador GLSL.

Christian Rau
fonte
Obrigado! Entendi para baixo a # 140, mas # 130 está dentro do meu alcance :)
nilstastic
11
@nilstatic Então, o que você mudou e o que ainda não funciona? Talvez você possa editar sua pergunta para incluir os novos shaders 1.40. Se você já tem 1,40, talvez você só tem que mudar o uso de seu costume positionvariando to gl_Position`.
Christian Rau