【问题标题】:LWJGL2 Multiple lights not working? All entities are blackLWJGL2 多个灯不工作?所有实体都是黑色的
【发布时间】:2017-11-20 23:18:02
【问题描述】:

所以我正在关注关于多灯和点灯的 ThinMatrixs 教程。我相信我已经正确地遵循了一切。

我首先按照多灯教程进行操作,没有任何实体和地形受到影响。我认为做下一个教程,与衰减有关,可以解决这个问题。现在我所有的对象都是黑色的。

我不确定可能出了什么问题。任何帮助将不胜感激。

Code here

Thinmatrix tutorial 25 multiple lights

//片段着色器

#version 400 core

in vec2 pass_textureCoordinates;
in vec3 surfaceNormal;
in vec3 toLightVector[4];
in vec3 toCameraVector;
in float visibility;

out vec4 out_Color;

uniform sampler2D modelTexture;
uniform vec3 lightColour[4];
uniform vec3 attenuation[4];
uniform float shineDamper;
uniform float reflectivity;
uniform vec3 skyColour;

void main(void){


    vec3 unitNormal = normalize(surfaceNormal);
    vec3 unitVectorToCamera = normalize(toCameraVector);

    vec3 totalDiffuse = vec3(0.0);
    vec3 totalSpecular = vec3(0.0);

    for(int i = 0; i < 4; i++) {

        float distance = length(toLightVector[i]);
        float attFactor = attenuation[i].x + (attenuation[i].y * distance) + (attenuation[i].z * distance * distance);
        vec3 unitLightVector = normalize(toLightVector[i]);
        float nDot1 = dot(unitNormal, unitLightVector);
        float brightness = max(nDot1, 0.0);
        vec3 lightDirection = -unitLightVector;
        vec3 reflectedLightDirection = reflect(lightDirection, unitNormal);
        float specularFactor = dot(reflectedLightDirection, unitVectorToCamera);
        specularFactor = max(specularFactor, 0.0);
        float dampedFactor = pow(specularFactor, shineDamper);

        totalDiffuse = totalDiffuse + (brightness * lightColour[i])/attFactor;
        totalSpecular = totalSpecular + (dampedFactor * reflectivity * lightColour[i])/attFactor;
}

  totalDiffuse = max(totalDiffuse, 0.2);


    vec4 textureColour = texture(modelTexture,pass_textureCoordinates);
    if(textureColour.a<0.5) {
        discard;
    }

    out_Color =  vec4(totalDiffuse,1.0) * textureColour + vec4(totalSpecular,1.0);
    out_Color = mix(vec4(skyColour,1.0),out_Color, visibility);

}

顶点着色器:

#version 400 core

in vec3 position;
in vec2 textureCoordinates;
in vec3 normal;

out vec2 pass_textureCoordinates;
out vec3 surfaceNormal;
out vec3 toLightVector[4];
out vec3 toCameraVector;
out float visibility;

uniform mat4 transformationMatrix;
uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform vec3 lightPosition[4];

uniform float useFakeLighting;

uniform float numberOfRows;
uniform vec2 offset;

const float density = 0.0035;
const float gradient = 5.0;

void main(void){



    vec4 worldPosition = transformationMatrix * vec4(position,1.0);
    vec4 positionRelativeToCam = viewMatrix * worldPosition;
    gl_Position = projectionMatrix * positionRelativeToCam;
    pass_textureCoordinates = (textureCoordinates/numberOfRows) + offset;

    vec3 actualNormal = normal;
    if(useFakeLighting > 0.5) {
    actualNormal = vec3(0.0,1.0,0.0);
    }

    surfaceNormal = (transformationMatrix * vec4(actualNormal,0.0)).xyz;
    for(int i =0; i< 4;i++) {
        toLightVector[i] = lightPosition[i] - worldPosition.xyz;
    }

    toCameraVector = (inverse(viewMatrix) * vec4(0.0,0.0,0.0,1.0)).xyz - worldPosition.xyz;

    float distance = length(positionRelativeToCam.xyz);
    visibility = exp(-pow((distance*density),gradient));
    visibility = clamp(visibility,0.0,0.9);

}

【问题讨论】:

    标签: java glsl lwjgl light


    【解决方案1】:

    在您的 StaticShader 类中:

    for(int i = 0; i < MAX_LIGHTS; i++) {
        location_lightPosition[i] = super.getUniformLocation("lightPosition{" + i + "}");
        location_lightColour[i] = super.getUniformLocation("lightColour{" + i + "}");
        location_attenuation[i] = super.getUniformLocation("attenuation[" + i + "}");
    }
    

    你使用的是}/{而不是]/[,因为opengl找不到uniform,亮度计算不起作用。

    如果您想检查是否找到制服,只需在您的 ShaderProgram 类中更改此代码:

    protected int getUniformLocation(String uniformName){
        int loc = GL20.glGetUniformLocation(programID,uniformName);
        if(loc==-1) System.err.println("Uniform with name \""+uniformName+"\" not found!");
        return loc;
    }
    

    来自 opengl 文档:

    glGetUniformLocation 返回一个表示位置的整数 程序对象内的特定统一变量。名称必须是 不包含空格的以空字符结尾的字符串。名称必须是 不是结构的程序中的活动统一变量名称, 结构数组,或向量或矩阵的子组件。 这个 如果名称与活动制服不对应,则函数返回 -1 程序中的变量,如果名称以保留前缀“gl_”开头,或者 如果 name 与原子计数器或命名的统一块相关联。

    如果仍然无法正常工作,请检查各个颜色值。 首先检查纹理:

    out_Color = textureColour;
    

    第二次检查漫射光:

    out_Color = vec4(totalDiffuse,1.0);
    

    第三次检查高光:

    out_Color = vec4(totalSpecular,1.0);
    

    我希望这会有所帮助。

    【讨论】:

    • 我重复了该教程,但由于某种原因,它当时奏效了。但是非常感谢您的 cmets。
    猜你喜欢
    • 2020-07-01
    • 2019-11-27
    • 2023-03-23
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 2014-01-30
    • 1970-01-01
    相关资源
    最近更新 更多