2017-10-03 13 views
1

J'ai donc travaillé sur un projet impliquant un shader personnalisé et avec l'aide de personnes ici j'ai pu implémenter un shader avec le code lambert et phong glsl avec l'aide de Rabbid76.Comment contrôler la position de la lumière depuis le shader et dans libgdx?

image

Maintenant, je veux utiliser la position de la lumière à la fois dans le code GLSL et libgdx. Rabbid76 m'a prêté ce code pour une nuance phong avec un struct Lightpoint. Je l'ai fait courir et je n'ai eu qu'un écran noir. Il y a un PointLight num_pointLights uniforme qui, je suppose, pointe vers la structure. Je ne sais pas comment l'incorporer comme un uniforme dans le code libgdx, ou comme une variable dans libgdx.

Vertex:

attribute vec3 a_position; 
attribute vec3 a_normal; 
attribute vec2 a_texCoord0; 

uniform mat4 u_worldTrans; 
uniform mat4 u_projViewTrans; 

varying vec2 v_texCoords; 
varying vec3 v_vertPosWorld; 
varying vec3 v_vertNVWorld; 

void main() 
{ 
    vec4 vertPos = u_worldTrans * vec4(a_position, 1.0); 
    v_vertPosWorld = vertPos.xyz; 
    v_vertNVWorld = normalize(mat3(u_worldTrans) * a_normal); 
    v_texCoords = a_texCoord0; 
    gl_Position = u_projViewTrans * vertPos; 
} 

Fragment:

varying vec2 v_texCoords; 
varying vec3 v_vertPosWorld; 
varying vec3 v_vertNVWorld; 

uniform sampler2D u_texture; 

struct PointLight 
{ 
    vec3 color; 
    vec3 position; 
    float intensity; 
}; 

uniform PointLight u_pointLights[1]; 

void main() 
{ 
    vec3 toLightVector = normalize(u_pointLights[0].position - v_vertPosWorld.xyz); 
    float lightIntensity = max(1.0, dot(v_vertNVWorld, toLightVector)); 
    vec4 texCol   = texture(u_texture, v_texCoords.st); 
    vec3 finalCol  = texCol.rgb * lightIntensity * u_pointLights[0].color; 
    gl_FragColor   = vec4(finalCol.rgb * lightIntensity, 10.0); 
} 

Son été suggéré que je peux initialiser la classe PointLight comme:. Environment.add (PointLight = new set (PointLight() ... ..)) ;, Mais je ne sais pas comment cela fonctionnerait parce que je devrais utiliser une variable de classe d'environnement au lieu de mon shader.

Je me sens si proche de l'obtenir. Mais je ne suis même pas sûr si c'est possible en utilisant cette méthode. Si quelqu'un est capable de partager une expérience et des connaissances sur la façon d'utiliser la position de la lumière ou la structure d'une manière significative, je serais vraiment très reconnaissant. :)

Voici le lien vers mon projet actuel: here

+0

Comment définissez-vous 'u_texture'? Comment utilisez-vous le shader? (Le lien est cassé) – Rabbid76

+0

Peut-être [** ce **] (https://xoppa.github.io/blog/creating-a-shader-with-libgdx/) tutoriel peut vous aider ou la réponse à [projecteur pas travaillant dans libGDX] (https://stackoverflow.com/questions/34383397/spotlight-not-working-in-libgdx) – Rabbid76

+0

Dans le lien du projecteur que vous avez donné, Xoppa fait référence à un lien où il suggère d'utiliser un defaultShader et une configuration comme celle-ci 'DefaultShader.Config config = nouveau DefaultShader.Config();' 'config.numPointLights = 0;' 'modelBatch = new ModelBatch (nouveau DefaultShaderProvider (config))' Puis-je utiliser mon shader de test (shader personnalisé) à la place du shader par défaut? J'ai peu de temps en ce moment, alors j'essaye de l'appliquer quand je rentre à la maison. En outre, le lien fonctionne maintenant. Merci encore. – winnieTheWind

Répondre

1

Après un peu de bricoler et de se demander ce qu'il faut faire, j'ai décidé de vérifier this. Je suis en quelque sorte à travers:

Vector3 LIGHT_POS = new Vector3(0, 0, 0); 

..et alors vu:

program.setUniformf("lightPosition", LIGHT_POS); 

..which références ce qui est dans le shader. Je ne savais pas si je pouvais comprendre cela.

o_O

I incrémenté la variable x dans le Vector3 LIGHT_POS, dans la fonction de rendre le matériau. Cela semble bien fonctionner. Je suppose que je devrais essayer le DirectionalLight quand j'y arrive.

code: here

+0

Quant à l'utilisation d'une structure PointLight dans glsl .... je n'ai aucune idée !! – winnieTheWind