Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java LWJGL2多个灯不工作?所有实体都是黑色的_Java_Glsl_Lwjgl_Light - Fatal编程技术网

Java LWJGL2多个灯不工作?所有实体都是黑色的

Java LWJGL2多个灯不工作?所有实体都是黑色的,java,glsl,lwjgl,light,Java,Glsl,Lwjgl,Light,因此,我将遵循ThinMatrix关于多光源和点光源的教程。我相信我一切都做对了 我首先学习了多灯光教程,没有任何实体和地形受到影响。我认为下一个教程中关于衰减的内容可以解决这个问题。现在我所有的物体都是黑色的 我不确定会出什么问题。任何帮助都将不胜感激 //片段着色器 #version 400 core in vec2 pass_textureCoordinates; in vec3 surfaceNormal; in vec3 toLightVector[4]; in vec3 to

因此,我将遵循ThinMatrix关于多光源和点光源的教程。我相信我一切都做对了

我首先学习了多灯光教程,没有任何实体和地形受到影响。我认为下一个教程中关于衰减的内容可以解决这个问题。现在我所有的物体都是黑色的

我不确定会出什么问题。任何帮助都将不胜感激

//片段着色器

#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);

}
#版本400核心
在vec2中,通过纹理坐标;
vec3表面异常;
在vec3-toLightVector[4]中;
在vec3中,转换为转换器;
浮标能见度;
out vec4 out_颜色;
纹理均匀;
均匀的vec3浅色[4];
均匀vec3衰减[4];
均匀浮光;
均匀浮动反射率;
均匀的vec3天色;
真空总管(真空){
vec3 unitNormal=标准化(表面异常);
vec3 unitVectorToCamera=标准化(toCameraVector);
vec3 totalDiffuse=vec3(0.0);
vec3总镜面反射=vec3(0.0);
对于(int i=0;i<4;i++){
浮动距离=长度(toLightVector[i]);
浮动系数=衰减[i].x+(衰减[i].y*距离)+(衰减[i].z*距离*距离);
vec3 unitLightVector=规格化(toLightVector[i]);
float nDot1=点(单位法线,单位光向量);
浮动亮度=最大值(nDot1,0.0);
vec3 lightDirection=-unitLightVector;
vec3反射光方向=反射(光方向,单位法线);
浮动镜面反射系数=点(反射光方向,单位向量或焦平面);
镜面反射系数=最大值(镜面反射系数,0.0);
浮子阻尼系数=功率(镜面反射系数,光速);
totalDiffuse=totalDiffuse+(亮度*亮度颜色[i])/attFactor;
totalSpecular=totalSpecular+(阻尼因子*反射率*浅色[i])/attFactor;
}
totalDiffuse=最大值(totalDiffuse,0.2);
vec4 TextureColor=纹理(模型纹理、过程纹理坐标);
if(纹理颜色a 0.5){
实际正常值=vec3(0.0,1.0,0.0);
}
表面异常=(转换矩阵*vec4(实际正常,0.0)).xyz;
对于(int i=0;i<4;i++){
toLightVector[i]=lightPosition[i]-worldPosition.xyz;
}
toCameraVector=(逆(viewMatrix)*vec4(0.0,0.0,0.0,1.0)).xyz-worldPosition.xyz;
浮动距离=长度(相对于凸轮xyz的位置);
能见度=exp(-pow((距离*密度),梯度));
可见性=夹具(可见性,0.0,0.9);
}

在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文档中:

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

如果仍然不起作用,请检查各个颜色值。 首先检查纹理:

out_Color = textureColour;
第二,检查漫射光:

out_Color = vec4(totalDiffuse,1.0);
第三,检查镜面反射光:

out_Color = vec4(totalSpecular,1.0);

我希望这能有所帮助。

我重复了教程,出于某种原因,它当时起作用了。但非常感谢您的评论。
out_Color = vec4(totalDiffuse,1.0);
out_Color = vec4(totalSpecular,1.0);