OpenGL法线贴图计算

时间:2017-04-01 09:10:38

标签: java opengl normals

我对在互联网上找到的一些代码有疑问,但未作进一步解释。

关于法线贴图的计算。 在我的顶点着色器上,我得到了光位置的统一变量(vec3)。但光的位置与视图矩阵预乘。因此,相对于相机可以访问灯光位置。

Java代码如下所示:(请注意,我使用多个灯光,这对计算本身没有影响; super.loadVector()上传统一向量)。

public void loadLights(List<Light> lights, Matrix4f viewMatrix){
    super.loadFloat(this.location_lightAmount, Math.min(RenderSettings.ENTITIES_MAX_LIGHTS,lights.size()));
    for(int i=0;i<RenderSettings.ENTITIES_MAX_LIGHTS;i++){
        if(i<lights.size()){
            super.loadVector(location_lightPositionEyeSpace[i], getEyeSpacePosition(lights.get(i), viewMatrix));
            super.loadVector(location_lightColor[i], lights.get(i).getColor());
            super.loadVector(location_lightAttenuation[i], lights.get(i).getAttenuation());
        }
    }
}

public static Vector3f getEyeSpacePosition(Light light, Matrix4f viewMatrix){
    Vector3f position = light.getAbsolutePosition();
    Vector4f eyeSpacePos = new Vector4f(position.x,position.y, position.z, 1f);
    Matrix4f.transform(viewMatrix, eyeSpacePos, eyeSpacePos);
    return new Vector3f(eyeSpacePos);
}

这对我没有意义,因为相机位置应该对法线的计算没有影响,对吗?

接下来是:当我没有法线贴图渲染时,我使用这样的变换矩阵变换每个顶点的法线:

in vec3 normal;
out vec3 surfaceNormal;

uniform mat4 transformationMatrix;

void(main) {
    //........
    surfaceNormal = (transformationMatrix * vec4(normal,0.0)).xyz;
    //........
}

但是,此计算不适用于我找到的法线贴图代码。这里,法线(和切线)与viewMatrix和transformationMatrix相乘,如下所示:

mat4 modelViewMatrix = viewMatrix * transformationMatrix;
vec3 surfaceNormal = (modelViewMatrix * vec4(normal,0.0)).xyz;

可以使用surfaceNormal和surfaceTangent计算出容易计算的比特率。然后使用tangentSpaceMatrix转换灯光位置。 但为什么视图矩阵用于所有转换?

我理解法线贴图的方法如下:变换整个系统,使三角形(正在渲染)平放在地面上(切线空间)。然后法线等于法线贴图的RGB值。 (我知道这听起来有点令人困惑,我希望你明白我的意思。)

问候,芬恩

0 个答案:

没有答案