2016-10-27 2 views
0

Я работал с OpenGL на куске курсовой работы, и у меня возникла проблема с моим шейдером фрагментов. Я пытаюсь добавить некоторое основное направленное освещение в текстурированную сетку. Я могу получить текстуру, чтобы она выглядела отлично без освещения.Open GL (GLSL) - Направленные руины освещения Текстура

Mesh without Lighting

Однако, когда я добавляю освещения он сохраняет цвет Габаритные текстуры, но удаляет детализацию текстуры все вместе.

Mesh with Lighting

Я не уверен, что вызывает его, и я не могу найти решение в Интернете. Спасибо за вашу помощь.

Vertex Shader

#version 440 

uniform mat4 uModel; //Model Location, Rotation, Scale 
uniform mat4 uView; //Camera Location, Rotation, Scale 
uniform mat4 uProjection; //Projection Matrix 

in vec3 vPosition; 
in vec3 vNormal; 
in vec2 vTexCoords; 

out vec3 oNormal; 
out vec3 oFragPos; 
out vec2 oTexCoords; 

void main() 
{ 
    gl_Position = vec4(vPosition, 1) * uModel * uView * uProjection; 
    oFragPos = vec3(vec4(vPosition, 1) * uModel); 

    oNormal = normalize(vNormal * mat3(transpose(inverse(uModel)))); 
    oTexCoords = vTexCoords; 
} 

Фрагмент Shader

#version 440 

//Ins 
in vec3 oNormal; 
in vec3 oFragPos; 
in vec2 oTexCoords; 

//Outs 
out vec4 fragColour; 

//Uniforms 
uniform sampler2D uTextureSampler; 

void main() 
{ 
    vec3 norm = normalize(oNormal); 

    // Phase 1: Directional lighting 
    float result = max(dot(norm, -vec3(0,0,1)),0.0); 

    fragColour = vec4(vec3(result),1.0) * texture(uTextureSampler, oTexCoords); 
} 
+0

Это не сработало ... Спасибо. –

+0

Можете ли вы попробовать удалить часть vec4 (vec3 (result), 1.0) * 'и посмотреть, все ли вы видите текстуру, или это то, что вы сделали на картинке выше? – TWT

+0

@thokra: OP, по-видимому, использует векторы-строки, а не традиционные столбцы-векторы, поэтому он умножается справа. Хотя это редкость в компьютерной графике, я думаю, что это действительно поддерживается, если вы придерживаетесь этого соглашения. – ybungalobill

ответ

1

цвет текстуры все еще здесь. Похоже, что один пиксель выбран в вашей текстуре. Проблема, похоже, исходит из значений «oTexCoords».

Вы можете попробовать:

fragColour = vec4(vec3(result),1.0) * vec4(oTexCoords, 0.0, 1.0); 

И проверить, если вы видите красный/зеленый градиент через куб.

При снятии освещения, таким образом, не используйте компонент освещения (значение «результат») в вашем шейдере, большинство компиляторов удалит весь код, который приведет к вычислению «результата».

«результат» будет удален. Поэтому из вашего шейдера исчезнут «норма», «нормар», «vormal».

Атрибуты местоположения будут меняться, и я предполагаю, что ваша проблема связана с тем, как вы получаете места расположения атрибутов вашей программы и «vertexAttribPointer» в этих местах.

+0

Manged, чтобы исправить это! Я ошибся с моими вершинными атрибутами. Спасибо. –