我在尝试做一个定制的光色器和尝试许多不同的东西随着时间的推移。一些解决方案,我找到更好的工作,其他人变得更糟。对于这个问题,我使用的解决方案,这最好的工作为止。

我的问题是,如果我"相机",光职位似乎要动了。这种解决方案具有非常微小,但明显的运动,和光的位置似乎是上述它应该是。

默认的照片照明(w/o任何着色器)的工作的现(稳光职位)但是我需要的着色用的多纹理和我的规划上使用的部分用于照明效果,一旦它的工作。

顶点的资料来源:

varying vec3 vlp, vn;

void main(void)
{
    gl_Position = ftransform();

    vn = normalize(gl_NormalMatrix * -gl_Normal);
    vlp = normalize(vec3(gl_LightSource[0].position.xyz) - vec3(gl_ModelViewMatrix * -gl_Vertex));

    gl_TexCoord[0] = gl_MultiTexCoord0;
} 

碎片来源:

uniform sampler2D baseTexture;
uniform sampler2D teamTexture;
uniform vec4 teamColor;

varying vec3 vlp, vn;

void main(void)
{
    vec4 newColor = texture2D(teamTexture, vec2(gl_TexCoord[0]));
    newColor = newColor * teamColor;
    float teamBlend = newColor.a;

    // mixing the textures and colorizing them. this works, I tested it w/o lighting!
    vec4 outColor = mix(texture2D(baseTexture, vec2(gl_TexCoord[0])), newColor, teamBlend);

    // apply lighting
    outColor *= max(dot(vn, vlp), 0.0);
    outColor.a = texture2D(baseTexture, vec2(gl_TexCoord[0])).a;

    gl_FragColor = outColor;
}

我做错了什么?

有帮助吗?

解决方案

我不能确定任何这些问题,但它们可能导致一个。

第一,需要恢复正常你每顶点 vnvlp (顺便说一句,尽量使用更具描述性的变量名称。 viewLightPosition 是一个很容易理解比 vlp).我知道你的归一化他们在顶点色器,但本段色器插将非规范化。

第二,这并不是特别错了那么多,因为多余。 vec3(gl_LightSource[0].position.xyz).所"的位置。xyz"已经是一个识别vec3这样的数据类型,因为调酒掩模(".xyz")只有3个组成。你不需要转换为一个识别vec3这样的数据类型了。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top