首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从着色器和libgdx控制灯光位置?

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

Stack Overflow用户
提问于 2017-10-03 09:16:26
回答 1查看 222关注 0票数 1

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

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

Rabbid76把这个代码借给了我一个带有结构灯点的phong shade。我试了一下,结果只看到一个黑屏。有一个统一的PointLight num_pointLights,我假设它指向这个结构。我不确定如何在libgdx代码中将其作为统一的,或者作为libgdx中的变量。

顶点:

代码语言:javascript
复制
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;
}

片段:

代码语言:javascript
复制
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 =新的PointLight().set( .....);,但我不确定这是如何工作的,因为我必须使用环境类变量而不是我的着色器。

我感觉就快拿到这个了。但我甚至不确定是否可以使用这种方法。如果有人能够分享一些关于如何以有意义的方式使用light位置或struct的经验和知识,我将非常感激。:)

这是我当前项目的链接:here

EN

回答 1

Stack Overflow用户

发布于 2017-10-04 19:56:21

经过一番修修补补,不知道该怎么做之后,我决定去看看this。不知何故,我遇到了:

代码语言:javascript
复制
Vector3 LIGHT_POS = new Vector3(0, 0, 0);

然后,..and看到:

代码语言:javascript
复制
program.setUniformf("lightPosition", LIGHT_POS);

..which引用着色器中的内容。我不确定我能不能解决这个问题。

o_O

我在着色器的渲染函数中增加了Vector3 LIGHT_POS中的x变量。它似乎工作得很好。我想当我有时间的时候,我应该试试DirectionalLight。

代码:here

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46535871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档