Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Помогите найти ошибку в шейдере (свет по Фонгу, блики) (2 стр)

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

Страницы: 1 2
AndreyПостоялецwww4 июня 201816:41#15
MikeNew
> Под усредненными нормалями ты ведь имеешь в виду как слева на картинке?
да. Это же и есть нормаль к вершине - точнее математически это нормаль к касательной плоскости к поверхности содержащей данную вершину, в данном случае поверхность это сфера, описанная вокруг куба.
innuendoПостоялецwww4 июня 201816:46#16
Andrey
> точнее математически это нормаль к касательной плоскости к поверхности
> содержащей данную вершину, в данном случае поверхность это сфера, описанная
> вокруг куба.

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

DelfigamerПостоялецwww4 июня 201816:48#17
Andrey
> точнее математически это нормаль к касательной плоскости
Наркоман что ли, в местах излома касательных=производных не существует.
AndreyПостоялецwww4 июня 201816:52#18
Ок, я ошибся
MrShoorУчастникwww4 июня 201818:35#19
MikeNew
У тебя нормали в вершинном шейдере в пространстве объекта, а view вектор в пространстве вида. Не надо так.
g-contПостоялецwww4 июня 201819:13#20
Не надо кубику усреднённые нормали, ерунда получится.
VoidSpiritПостоялецwww5 июня 20180:18#21
Кажется, та же фигня, что у меня (и еще у кого-то встречал). При контровом свете неправильно считается. Я высмотрел такое решение: делается затухание
vec3 specular = pow(max(dot(R, V), 0.0), 16.0) * vec3(0.75) * pow(max(0, dot(N, L)), 0.6);
вот правая часть нужна. Со знаком векторов могу ошибиться, попробуй поиграться здесь
MikeNewПостоялецwww5 июня 201810:26#22
MrShoor
> MikeNew
> У тебя нормали в вершинном шейдере в пространстве объекта, а view вектор в
> пространстве вида. Не надо так.
Да как-то так оно и было, внимательно перечитал теорию и поправил. Спасибо.

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

MikeNewПостоялецwww5 июня 201810:44#23
Смотрите, какая интересная вещь с юниформами у меня образовалась.

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

  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 в юниформу?
Как так получается и почему, просветите подавана.

Правка: 5 июня 2018 10:45

innuendoПостоялецwww5 июня 201810:47#24
MikeNew
> Как так получается и почему, просветите подавана.

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

MikeNewПостоялецwww5 июня 201810:49#25
innuendo
> выравнивания ?
... а ведь похоже на то.
Сейчас буду копать.
MikeNewПостоялецwww5 июня 201810:55#26
innuendo
> выравнивания ?
Спасибо, vec4 вместо vec3 решили проблему, это действительно было выравнивание.

Правка: 5 июня 2018 10:55

SuslikМодераторwww5 июня 201810:56#27
MikeNew
это не совсем выравнивание, это padding.
MikeNewПостоялецwww5 июня 201810:58#28
Поскольку мне на этом форуме уже говорили, что по правилам хорошего тона неплохо было бы выкладывать решение проблемы если ее нашел, выкладываю поправленный вершинный шейдер:
#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;   
}

MikeNewПостоялецwww5 июня 201811:02#29
Suslik
> MikeNew
> это не совсем выравнивание, это padding.
В общем, я понял что лучше ничего не пихать в юниформу, если оно не кратно двойке, а то потом замучишься искать ошибку. :)
Страницы: 1 2

/ Форум / Программирование игр / Графика

2001—2018 © GameDev.ru — Разработка игр