2017-11-20 3 views
0

그래서 여러 개의 표시등과 포인트 표시등에 대한 ThinMatrixs 자습서를 따르고 있습니다. 나는 내가 모든 것을 정확하게 따라 왔다고 믿는다.LWJGL2 여러 표시등이 작동하지 않습니까? 모든 엔티티는 검정색입니다

enter image description here

내가 먼저 여러 빛이 튜토리얼 다음과 실체와 지형의 아무도는 영향을받지되고 있었다. 감쇠와 관련된 다음 튜토리얼을 수행하는 것이이 문제를 해결할 것이라고 생각했습니다. 이제 모든 내 물건은 검게 그늘지게됩니다.

내가 잘못 생각할 수 있습니다. 어떤 도움을 주시면 감사하겠습니다.

Code here

Thinmatrix tutorial 25 multiple lights

// FRAGMENT SHADER

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

} 

버텍스 쉐이더 : 당신의 StaticShader 클래스에서

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

} 

답변

1

:

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이 유니폼을 찾을 수 없어 밝기 계산이 작동하지 않기 때문입니다.

당신은 균일 한이 당신의 ShaderProgram 클래스에서이 코드를 CHAGE 발견되어 있는지 확인하려면 다음 OpenGL을 문서에서

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; 
} 

:

glGetUniformLocation이 위치를 나타내는 정수를 반환

프로그램 오브젝트 내의 특정 유니폼 변수의 값. name은 공백이 포함되지 않은 null 종료 문자열이어야합니다. name은 구조체가 아닌 프로그램에서 활성 유니폼 변수 이름이거나 구조체 배열이거나 벡터 또는 행렬의 하위 구성 요소 여야합니다. 이 함수는 -1을 리턴 이름이 프로그램에서 활성 균일 변수에 대응하지 않는 경우, 이름이 예약 된 접두어 "gl_"로 시작하거나 경우 이름 원자 카운터 또는 명명 균일 블록과 관련된 경우.

그래도 작동하지 않으면 개별 색상 값을 확인하십시오. 먼저 질감 확인 :

out_Color = vec4(totalDiffuse,1.0); 

셋째 반사 빛을 확인하십시오 :

out_Color = vec4(totalSpecular,1.0); 

난이 도움이되기를 바랍니다

out_Color = textureColour; 

둘째 확산 등을 확인합니다.

+0

나는이 튜토리얼을 반복했는데 어떤 이유로 그것이 그 때 일했다. 그러나 귀하의 의견은 대단히 감사하겠습니다. – winnieTheWind

관련 문제