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

3d 如何从着色器和libgdx中控制灯光位置?,3d,libgdx,shader,3d,Libgdx,Shader,因此,我一直在从事一个涉及自定义着色器的项目,在这里的人员的帮助下,我能够在Rabbid76的帮助下使用lambert和phong glsl代码实现着色器 现在我想利用glsl代码和libgdx中灯光的位置 Rabbid76借给我一个带结构光点的phong灯罩的代码。我试了一下,结果只得到了一个黑屏。这里有一个统一的PointLight num_pointLights,我假设它指向结构。我不确定如何在libgdx代码中将其合并为统一代码,或将其合并为libgdx中的变量 顶点: attribu

因此,我一直在从事一个涉及自定义着色器的项目,在这里的人员的帮助下,我能够在Rabbid76的帮助下使用lambert和phong glsl代码实现着色器

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

Rabbid76借给我一个带结构光点的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=newpointlight().set(…);,但我不确定这将如何工作,因为我必须使用环境类变量而不是着色器

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

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

经过一番修补和思考,我决定退房。我不知怎的遇到了:

Vector3 LIGHT_POS = new Vector3(0, 0, 0);
…然后看到:

program.setUniformf("lightPosition", LIGHT_POS);
…引用着色器中的内容。我不确定我是否能弄明白这一点

欧欧欧

我在着色器的渲染函数中增加了Vector3 LIGHT_POS中的x变量。它似乎工作得很好。我想我应该试试方向灯,等我找到它的时候


代码:

在您提供的spotlight链接中,Xoppa引用了一个链接,其中建议使用defaultShader和类似“defaultShader.config config=new defaultShader.config();”的配置config.numPointLights=0;“”modelBatch=newmodelbatch(newdefaultshaderprovider(config));'我可以使用我的测试着色器(自定义着色器)代替默认着色器吗?我现在时间不多,所以我尽量在回家后实施。此外,该链接现在正在运行。再次感谢…并回答你的问题…嗯。。。我使用bind命令绑定纹理。老实说,我甚至不知道在着色器中使用u_纹理和setUniformi命令是否有任何作用?但我会测试它是否在没有它的情况下能正常工作。谢谢