Войти
ПрограммированиеФорумГрафика

Помогите найти ошибку в шейдере (свет по Фонгу, блики) (2 стр)

Страницы: 1 2
#15
16:41, 4 июня 2018

MikeNew
> Под усредненными нормалями ты ведь имеешь в виду как слева на картинке?
да. Это же и есть нормаль к вершине - точнее математически это нормаль к касательной плоскости к поверхности содержащей данную вершину, в данном случае поверхность это сфера, описанная вокруг куба.


#16
16:46, 4 июня 2018

Andrey
> точнее математически это нормаль к касательной плоскости к поверхности
> содержащей данную вершину, в данном случае поверхность это сфера, описанная
> вокруг куба.

о ужас! куб, это не гладкая поверхность

#17
16:48, 4 июня 2018

Andrey
> точнее математически это нормаль к касательной плоскости
Наркоман что ли, в местах излома касательных=производных не существует.

#18
16:52, 4 июня 2018

Ок, я ошибся

#19
18:35, 4 июня 2018

MikeNew
У тебя нормали в вершинном шейдере в пространстве объекта, а view вектор в пространстве вида. Не надо так.

#20
19:13, 4 июня 2018

Не надо кубику усреднённые нормали, ерунда получится.

#21
0:18, 5 июня 2018

Кажется, та же фигня, что у меня (и еще у кого-то встречал). При контровом свете неправильно считается. Я высмотрел такое решение: делается затухание
vec3 specular = pow(max(dot(R, V), 0.0), 16.0) * vec3(0.75) * pow(max(0, dot(N, L)), 0.6);
вот правая часть нужна. Со знаком векторов могу ошибиться, попробуй поиграться здесь

#22
10:26, 5 июня 2018

MrShoor
> MikeNew
> У тебя нормали в вершинном шейдере в пространстве объекта, а view вектор в
> пространстве вида. Не надо так.
Да как-то так оно и было, внимательно перечитал теорию и поправил. Спасибо.

Спасибо всем за помощь.

#23
(Правка: 10:45) 10:44, 5 июня 2018

Смотрите, какая интересная вещь с юниформами у меня образовалась.

Вот есть у меня структура:

  struct KameraUBO_Models {
    glm::mat4 proj;
    glm::mat4 view;
    glm::vec3 lightPos;    
  };

передается в шейдер:

layout (binding = 0) uniform UboView 
{
  mat4 proj;
  mat4 view;
  vec3 lightPos;
} uboView;

Все хорошо работает как и должно работать, lightPos правильно передает координаты.
Но если я добавляю в структура еще один вектор, перед lightPos, вот так:

  struct KameraUBO_Models {
    glm::mat4 proj;
    glm::mat4 view;
    glm::vec3 viewPos;    
    glm::vec3 lightPos;    
  };
layout (binding = 0) uniform UboView 
{
  mat4 proj;
  mat4 view;
  vec3 viewPos;
  vec3 lightPos;
} uboView;

у lightPos непонятным мне образом путаются координаты: z становится y, y становится x, а x вообще обнуляется.
vec3 - это же просто три подряд значения float в данном случае, разве нет? Почему бьются данные при добавлении еще одного vec3 в юниформу?
Как так получается и почему, просветите подавана.

#24
10:47, 5 июня 2018

MikeNew
> Как так получается и почему, просветите подавана.

выравнивания ?

#25
10:49, 5 июня 2018

innuendo
> выравнивания ?
... а ведь похоже на то.
Сейчас буду копать.

#26
(Правка: 10:55) 10:55, 5 июня 2018

innuendo
> выравнивания ?
Спасибо, vec4 вместо vec3 решили проблему, это действительно было выравнивание.

#27
10:56, 5 июня 2018

MikeNew
это не совсем выравнивание, это padding.

#28
10:58, 5 июня 2018

Поскольку мне на этом форуме уже говорили, что по правилам хорошего тона неплохо было бы выкладывать решение проблемы если ее нашел, выкладываю поправленный вершинный шейдер:

#version 450
#extension GL_ARB_separate_shader_objects : enable




layout (binding = 0) uniform UboView 
{
  mat4 proj;
  mat4 view;
        vec4 viewPos;
        vec4 lightPos;

} uboView;

layout (location = 0) in vec3 inPosition;
layout (location = 1) in vec3 inNormal;
layout (location = 2) in vec2 uv;
layout (location = 3) in vec3 inColor;

layout (location = 0) out vec3 fragColor;
layout (location = 1) out vec3 outNormal;
layout (location = 2) out vec2 fragTexCoord;    
layout (location = 3) out vec3 outViewVec;
layout (location = 4) out vec3 outLightVec;

out gl_PerVertex {
    vec4 gl_Position;
};

void main() {
 gl_Position = uboView.proj * uboView.view * uboView.model * vec4(inPosition, 1.0);

    fragColor = inColor;
    fragTexCoord = uv;

    vec4 pos = uboView.model * vec4(inPosition, 1.0);
    outNormal = mat3(transpose(inverse(uboView.model))) * inNormal;

    outLightVec = uboView.lightPos.xyz - pos.xyz;
    outViewVec = uboView.viewPos.xyz - pos.xyz;   
}

#29
11:02, 5 июня 2018

Suslik
> MikeNew
> это не совсем выравнивание, это padding.
В общем, я понял что лучше ничего не пихать в юниформу, если оно не кратно двойке, а то потом замучишься искать ошибку. :)

Страницы: 1 2
ПрограммированиеФорумГрафика