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);
}
Respostas:
Primeiro, você não poderá usar
struct
s para variar dados (alterado em 1,50), mas ainda poderá usarin
e, emout
vez deattribute
evarying
. Além disso, você deve escrever na variável internagl_Position
no sombreador de vértices (alterado por 1,40). Portanto, no shader de vértice, substitua a declaraçãooutData
por algo semelhante ae use em
gl_Position
vez deoutData.position
.Não tenho certeza se a extensão ARB_explicit_attrib_location já é essencial, então talvez você precise adicionar
para usar a
layout
sintaxe ou apenas definir os locais dos atributos no aplicativo chamandoglBindAttribLocation
antes 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
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 devert.position
paragl_PositionIn[0]
.Em seguida, acho que a
layout
sintaxe 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 deglProgramParameteri
.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
layout
sintaxe 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.
fonte
position
variandoto
gl_Position`.