如何从着色器和libgdx中控制灯光位置?

时间:2017-10-03 01:16:26

标签: 3d libgdx shader

所以我一直致力于一个涉及自定义着色器的项目,在这里的人的帮助下,我已经能够在Rabbid76的帮助下实现一个带有lambert和phong glsl代码的着色器。

image

现在我想在glsl代码和libgdx中使用灯光的位置。

Rabbid76借给我一个带有结构Lightpoint的phong阴影的代码。我试了一下,除了黑屏外什么都没有。有一个统一的PointLight num_pointLights,我假设它指向结构。我不确定如何将其作为libgdx代码中的统一或libgdx中的变量合并。

顶点:

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;
}

片段:

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 );
}

有人建议我可以初始化PointLight类,如:environment.add(pointLight = new PointLight()。set(.....));,但我不确定这是如何工作的,因为我会使用环境类变量而不是我的着色器。

我觉得这很接近。但我甚至不确定它是否可能使用这种方法。如果有人能够以有意义的方式分享关于如何使用灯光位置或结构的一些经验和知识,我真的很感激。 :)

以下是我当前项目的链接: here

1 个答案:

答案 0 :(得分:1)

经过一些修补并想知道该怎么做后,我决定查看this。我莫名其妙地遇到了:

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

..然后看到:

program.setUniformf("lightPosition", LIGHT_POS);

..它引用着色器中的什么。我不确定我是否能解决这个问题。

O_O

我在着色器的渲染功能中增加了Vector3 LIGHT_POS中的x变量。它似乎运作良好。我想我应该在试用它时尝试一下DirectionalLight。

代码:here