Domanda

Sto cercando di creare un light shader personalizzato e nel tempo ho provato molte cose diverse. Alcune delle soluzioni che ho trovato funzionano meglio, altre peggio.Per questa domanda sto usando la soluzione che ha funzionato meglio finora.

Il mio problema è che se sposto la "fotocamera", anche la posizione della luce sembra muoversi.Questa soluzione ha un movimento molto leggero ma evidente e la posizione della luce sembra essere al di sopra di dove dovrebbe essere.

L'illuminazione OpenGL predefinita (senza shader) funziona bene (posizioni della luce stabili) ma ho bisogno dello shader per il multitesturing e ho intenzione di usarne parti per gli effetti di luce una volta che funziona.

Origine vertice:

varying vec3 vlp, vn;

void main(void)
{
    gl_Position = ftransform();

    vn = normalize(gl_NormalMatrix * -gl_Normal);
    vlp = normalize(vec3(gl_LightSource[0].position.xyz) - vec3(gl_ModelViewMatrix * -gl_Vertex));

    gl_TexCoord[0] = gl_MultiTexCoord0;
} 

Fonte del frammento:

uniform sampler2D baseTexture;
uniform sampler2D teamTexture;
uniform vec4 teamColor;

varying vec3 vlp, vn;

void main(void)
{
    vec4 newColor = texture2D(teamTexture, vec2(gl_TexCoord[0]));
    newColor = newColor * teamColor;
    float teamBlend = newColor.a;

    // mixing the textures and colorizing them. this works, I tested it w/o lighting!
    vec4 outColor = mix(texture2D(baseTexture, vec2(gl_TexCoord[0])), newColor, teamBlend);

    // apply lighting
    outColor *= max(dot(vn, vlp), 0.0);
    outColor.a = texture2D(baseTexture, vec2(gl_TexCoord[0])).a;

    gl_FragColor = outColor;
}

Cosa sto facendo di sbagliato?

È stato utile?

Soluzione

Non posso essere certo che nessuno di questi sia il problema, ma potrebbero causarne uno.

Per prima cosa, devi normalizzare il tuo vn per vertice e vlp (a proposito, prova a utilizzare nomi di variabile più descrittivi. viewLightPosition è molto più facile da capire rispetto a vlp).So che li hai normalizzati nel vertex shader, ma l'interpolazione dello shader dei frammenti li denormalizzerà.

In secondo luogo, questo non è tanto sbagliato quanto ridondante.vec3(gl_LightSource[0].position.xyz)."Position.xyz" è già un vec3, poiché la maschera di swizzle (".xyz") ha solo 3 componenti.Non è necessario trasmetterlo di nuovo a un vec3.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top