【问题标题】:GLSL Point Light TransformationGLSL点光源变换
【发布时间】:2013-03-13 23:54:17
【问题描述】:

我在 GLSL 中编写了一个基本的顶点着色器。以下是源代码:

varying float intensity;
uniform vec4 lightPos;

void main() {
    intensity = 0.1;
    vec3 tfVert = (gl_ModelViewMatrix*gl_Vertex).xyz;
    vec3 tfNorm = normalize(gl_NormalMatrix*gl_Normal).xyz;
    vec3 tfLightPos = (gl_ModelViewMatrix*lightPos).xyz;

    vec3 lightDir = normalize(tfLightPos-tfVert).xyz;
    intensity += dot(lightDir, tfNorm);

    gl_Position = gl_ModelViewProjectionMatrix*gl_Vertex;
}

之后,片段着色器以不同强度浮动的亮度照亮片段。出了问题:我画了几个立方体,然后将一个 OBJ 模型加载到世界中,或者类似的东西。然后我使用 glRotatef() 和 glTranslatef() 并再次绘制相同的东西。 灯光出现两次,(有点)在两个不同的位置。一次在翻译位置,一次在原始位置。平移后的模型仅受平移位置的光线影响,而原始模型仅受原始位置的光线影响。另外,我不使用 gl_LightSource0[] 来解决这个问题也很重要。有什么我做错了吗?有没有什么办法解决这一问题?我正在使用 glTranslatef() 和 glRotatef() 进行相机定位和旋转,如果这很重要的话。

【问题讨论】:

  • 你的#version指令在哪里?
  • @genpfault #version 120
  • 预期的行为是什么?一盏灯照亮一切?
  • @genpfault 是的,这就是我们想要的效果......

标签: java opengl glsl lwjgl


【解决方案1】:

不要通过 gl_ModelViewMatrix 变换 lightPos

只需使用 lightPos.xyz 代替 tfLightPos ——实际上你根本不需要 tfLightPos

【讨论】:

  • 不过,这只是将灯光的位置设置为相机的位置。
  • 换句话说,你的 lightPos 值为 {0,0,0}?
  • 是的,对不起,我应该说 :P 我正在寻找一种方法来将灯光的位置保持在世界空间中的 {0,0,0} 或任何其他位置。
  • 在将模型和相机 xform 组合在一起之前,您需要获得一个光照位置。因此,您将传递相对于相机的位置。
  • @Abaab 也许与当前问题完全无关,但你的评论让我明白了为什么我有头灯(绑定到相机位置、旋转......)而不是简单的灯。
【解决方案2】:

遗憾的是,如果不将更多信息传递给顶点着色器,这是不可能解决的。由于 glTranslatef 和 glRotatef 用于相机运动以及模型运动,因此着色器无法在不将变换和旋转传递给 vec3s 中的 GLSL 的情况下区分两者。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    • 2017-04-18
    相关资源
    最近更新 更多