Не могу получить плоское освещение в Java и OpenGL для работы - PullRequest
0 голосов
/ 26 января 2019

Я уже около двух недель пытаюсь добиться того, чтобы в моем шейдере openGL работало плоское освещение, я перепробовал множество учебных пособий, но до сих пор не могу заставить его работать, поэтому я решил опубликовать что-то на этом сайте, я также искалМэйби, вы можете мне помочь.

Вершинный шейдер:

#version 330 core

// vertex shader input \\
in vec3 position;
in vec2 textureCoords;
in vec3 normal;

// vertex shader output \\
out vec2 pass_textureCoords;
out vec3 surfaceNormal;
out vec3 toLightVector;
out vec3 toCameraVector;
out float visibility;

// uniform variables \\
uniform mat4 transformationMatrix;
uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform vec3 lightPosition;

// fog settings \\
const float density = 0.0012;
const float gradient = 5.0;

void main(void){

    vec4 worldPosition = transformationMatrix * vec4(position, 1.0);
    vec4 positionRelativeToCam = viewMatrix * worldPosition;
    gl_Position = projectionMatrix * positionRelativeToCam;
    pass_textureCoords = textureCoords * 40.0;

    surfaceNormal = (transformationMatrix * vec4(normal, 0.0)).xyz;
    toLightVector = lightPosition - worldPosition.xyz;
    toCameraVector = (inverse(viewMatrix) * vec4(0.0, 0.0, 0.0, 1.0)).xyz - worldPosition.xyz;

    // fog stuff \\
    float distance = length(positionRelativeToCam.xyz);
    visibility = exp(-pow((distance * density), gradient));
    visibility = clamp(visibility, 0.0, 1.0);

}

Фрагментный шейдер:

#version 330 core

// fragment shader input \\
in vec2 pass_textureCoords;
in vec3 surfaceNormal;
in vec3 toLightVector;
in vec3 toCameraVector;
in float visibility;

// colour output \\
out vec4 out_Colour;

// uniform variables \\
uniform sampler2D textureSampler;
uniform vec3 lightColour;
uniform float shineDamper;
uniform float reflectivity;
uniform vec3 skyColour;

void main(void){

    vec3 unitNormal = normalize(surfaceNormal);
    vec3 unitLightVector = normalize(toLightVector);

    float nDot1 = dot(unitNormal, unitLightVector);
    float brightness = max(nDot1, 0.25) + 0.05;
    vec3 diffuse = brightness * lightColour;

    vec3 unitVectorToCamera = normalize(toCameraVector);
    vec3 lightDirection = -unitLightVector;
    vec3 reflectedLightDirection = reflect(lightDirection, unitNormal);

    float specularFactor = dot(reflectedLightDirection, unitVectorToCamera);
    specularFactor = max(specularFactor, 0.0);
    float dampedFactor = pow(specularFactor, shineDamper);
    vec3 finalSpecular = dampedFactor * lightColour;

    out_Colour =  vec4(diffuse, 1.0) * texture(textureSampler, pass_textureCoords) + vec4(finalSpecular, 1.0);
    out_Colour = mix(vec4(skyColour,1.0), out_Colour, visibility);

}

Если вы знаете, как я могу применить плоскую штриховку к своему проектупожалуйста, дайте мне знать.

Заранее спасибо

1 Ответ

0 голосов
/ 26 января 2019

Если вы знаете, как я могу применить плоскую заливку к своему проекту, пожалуйста, дайте мне знать.

Используйте квалификатор интерполяции flat для выходов вершинного шейдера, которые используются для объединения света:

Вершинный шейдер:

flat out vec3 surfaceNormal;
flat out vec3 toLightVector;
flat out vec3 toCameraVector;

Фрагмент шейдера:

flat in vec3 surfaceNormal;
flat in vec3 toLightVector;
flat in vec3 toCameraVector;

См. Язык затенения OpenGL 3.30 Спецификация; 4.3.9 Интерполяция; страница 41

Переменная, определенная как плоская, не будет интерполироваться. Вместо этого он будет иметь одинаковое значение для каждого фрагмента в треугольнике. Это значение будет исходить из одной провоцирующей вершины, [...]

...