Я реализую затенение Blinn в своем фрагментном шейдере, на данном этапе мне нужно только жестко запрограммировать направление света. Но если я определю значение в пространстве вида модели, свет будет меняться при перемещении камеры вокруг объекта. Я попытался применить умножение направления света с помощью моей mv-матрицы, но это привело к некоторым странным ошибкам. Я хочу спросить, как мне изменить направление света, чтобы затенение объекта не менялось при перемещении камеры?
#version 330 core
layout(location = 0) out vec4 color;
uniform mat4 mv;
in vec2 texCoord;
in vec3 mv_pos3;
in vec3 mv_nml3;
void main()
{
vec3 li = vec3(1.0, 1.0, 1.0);
vec3 k_s = vec3(1.0, 1.0, 1.0);
vec3 ld = vec3(1.0, 0.0, 0.0);
mat4 mv_s = mv;
vec3 ld3 = normalize(ld);
vec3 nml3 = normalize(mv_nml3);
float cos_theta = max(dot(ld3, nml3), 0.0);
vec3 r = - ld3 + 2.0 * cos_theta * nml3;
vec3 v = vec3(0.0,0.0,-1.0);
float cos_thy = max(dot(r, v), 0.0);
vec4 k_d4 = vec4(1.0, 0.0, 0.0, 1.0); // Diffuse color
color = vec4(li * (cos_theta * k_d4.xyz + k_s * pow(cos_thy, 5.0)), 1.0);
}
Я вычисляю матрицы именно так, я только начинаю учиться, поэтому код немного запутан.
glm::mat4 MatrixGenerator::create_matrix(cy::TriMesh& trimesh)
{
trimesh.ComputeBoundingBox();
cy::Vec3f boundCenter = (trimesh.GetBoundMin() + trimesh.GetBoundMax()) * 0.5f;
static float radian = 0.0f;
static float delta = 0.000f;
radian += delta;
glm::mat4 scaleMatrix;
if (m_Camera->GetPerspection()) {
scaleMatrix = glm::scale(glm::mat4(1.0f), glm::vec3(-0.25f, -0.25f, 0.25f));
} else {
float cameraDistance = glm::length(m_Camera->GetPos() - glm::vec3(0.25f * boundCenter.x, 1.25f * boundCenter.y, 0.25f * boundCenter.z + 7.0f));
float scaleFactor = 1.0f / (cameraDistance + 0.01f);
scaleMatrix = glm::scale(glm::mat4(1.0f), glm::vec3(-scaleFactor, -scaleFactor, scaleFactor));
}
glm::mat4 rotationMatrix = glm::rotate(glm::mat4(1.0f), radian, glm::vec3(0.0f, 1.0f, 0.0f));
glm::mat4 translationMatrix = glm::translate(glm::mat4(1.0f), glm::vec3(-0.25f * boundCenter.x, 0.25f * boundCenter.y, -0.25f * boundCenter.z + 7.0f));
glm::mat4 viewMatrix = create_view();
glm::mat4 projectionMatrix;
if (m_Camera->GetPerspection()) {
float FOV = 90.0f;
projectionMatrix = create_perspective(FOV, 0.1f, 50.0f);
} else {
float orthoSize = 2.0f;
float aspectRatio = static_cast(m_WindowWidth) / static_cast(m_WindowHeight);
projectionMatrix = glm::ortho(-orthoSize * aspectRatio,
orthoSize * aspectRatio,
-orthoSize,
orthoSize,
0.1f,
50.0f);
}
glm::mat4 modelMatrix = translationMatrix * rotationMatrix * scaleMatrix;
glm::mat4 result = projectionMatrix * viewMatrix * modelMatrix;
mvp = result;
mv = viewMatrix * modelMatrix;
glm::mat3 mv3(mvp);
mn = glm::transpose(glm::inverse(mv3));
created = true;
return result;
}
glm::mat4 MatrixGenerator::create_perspective(float angle, float zNear, float zFar)
{
float aspectRatio = static_cast(m_WindowWidth) / static_cast(m_WindowHeight);
glm::mat4 perspectiveMatrix = glm::perspective(glm::radians(angle), aspectRatio, zNear, zFar);
return perspectiveMatrix;
}
glm::mat4 MatrixGenerator::create_view()
{
glm::vec3 forwardVec = m_Camera->GetTarget();
glm::vec3 upVec = m_Camera->GetUp();
glm::vec3 rightVec = glm::cross(forwardVec, upVec);
glm::mat4 viewMatrix1 = glm::mat4(
rightVec.x, upVec.x, -forwardVec.x, 0.0f,
rightVec.y, upVec.y, -forwardVec.y, 0.0f,
rightVec.z, upVec.z, -forwardVec.z, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f
);
glm::mat4 viewMatrix2 = glm::mat4(
1.0f, 0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f,
-m_Camera->GetPos().x,
-m_Camera->GetPos().y,
-m_Camera->GetPos().z,
1.0f
);
return viewMatrix1 * viewMatrix2;
}
Подробнее здесь: https://stackoverflow.com/questions/792 ... ent-shader
Жесткое кодирование направления света в моем фрагментном шейдере ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1732396313
Anonymous
Я реализую затенение Blinn в своем фрагментном шейдере, на данном этапе мне нужно только жестко запрограммировать направление света. Но если я определю значение в пространстве вида модели, свет будет меняться при перемещении камеры вокруг объекта. Я попытался применить умножение направления света с помощью моей mv-матрицы, но это привело к некоторым странным ошибкам. Я хочу спросить, как мне изменить направление света, чтобы затенение объекта не менялось при перемещении камеры?
#version 330 core
layout(location = 0) out vec4 color;
uniform mat4 mv;
in vec2 texCoord;
in vec3 mv_pos3;
in vec3 mv_nml3;
void main()
{
vec3 li = vec3(1.0, 1.0, 1.0);
vec3 k_s = vec3(1.0, 1.0, 1.0);
vec3 ld = vec3(1.0, 0.0, 0.0);
mat4 mv_s = mv;
vec3 ld3 = normalize(ld);
vec3 nml3 = normalize(mv_nml3);
float cos_theta = max(dot(ld3, nml3), 0.0);
vec3 r = - ld3 + 2.0 * cos_theta * nml3;
vec3 v = vec3(0.0,0.0,-1.0);
float cos_thy = max(dot(r, v), 0.0);
vec4 k_d4 = vec4(1.0, 0.0, 0.0, 1.0); // Diffuse color
color = vec4(li * (cos_theta * k_d4.xyz + k_s * pow(cos_thy, 5.0)), 1.0);
}
Я вычисляю матрицы именно так, я только начинаю учиться, поэтому код немного запутан.
glm::mat4 MatrixGenerator::create_matrix(cy::TriMesh& trimesh)
{
trimesh.ComputeBoundingBox();
cy::Vec3f boundCenter = (trimesh.GetBoundMin() + trimesh.GetBoundMax()) * 0.5f;
static float radian = 0.0f;
static float delta = 0.000f;
radian += delta;
glm::mat4 scaleMatrix;
if (m_Camera->GetPerspection()) {
scaleMatrix = glm::scale(glm::mat4(1.0f), glm::vec3(-0.25f, -0.25f, 0.25f));
} else {
float cameraDistance = glm::length(m_Camera->GetPos() - glm::vec3(0.25f * boundCenter.x, 1.25f * boundCenter.y, 0.25f * boundCenter.z + 7.0f));
float scaleFactor = 1.0f / (cameraDistance + 0.01f);
scaleMatrix = glm::scale(glm::mat4(1.0f), glm::vec3(-scaleFactor, -scaleFactor, scaleFactor));
}
glm::mat4 rotationMatrix = glm::rotate(glm::mat4(1.0f), radian, glm::vec3(0.0f, 1.0f, 0.0f));
glm::mat4 translationMatrix = glm::translate(glm::mat4(1.0f), glm::vec3(-0.25f * boundCenter.x, 0.25f * boundCenter.y, -0.25f * boundCenter.z + 7.0f));
glm::mat4 viewMatrix = create_view();
glm::mat4 projectionMatrix;
if (m_Camera->GetPerspection()) {
float FOV = 90.0f;
projectionMatrix = create_perspective(FOV, 0.1f, 50.0f);
} else {
float orthoSize = 2.0f;
float aspectRatio = static_cast(m_WindowWidth) / static_cast(m_WindowHeight);
projectionMatrix = glm::ortho(-orthoSize * aspectRatio,
orthoSize * aspectRatio,
-orthoSize,
orthoSize,
0.1f,
50.0f);
}
glm::mat4 modelMatrix = translationMatrix * rotationMatrix * scaleMatrix;
glm::mat4 result = projectionMatrix * viewMatrix * modelMatrix;
mvp = result;
mv = viewMatrix * modelMatrix;
glm::mat3 mv3(mvp);
mn = glm::transpose(glm::inverse(mv3));
created = true;
return result;
}
glm::mat4 MatrixGenerator::create_perspective(float angle, float zNear, float zFar)
{
float aspectRatio = static_cast(m_WindowWidth) / static_cast(m_WindowHeight);
glm::mat4 perspectiveMatrix = glm::perspective(glm::radians(angle), aspectRatio, zNear, zFar);
return perspectiveMatrix;
}
glm::mat4 MatrixGenerator::create_view()
{
glm::vec3 forwardVec = m_Camera->GetTarget();
glm::vec3 upVec = m_Camera->GetUp();
glm::vec3 rightVec = glm::cross(forwardVec, upVec);
glm::mat4 viewMatrix1 = glm::mat4(
rightVec.x, upVec.x, -forwardVec.x, 0.0f,
rightVec.y, upVec.y, -forwardVec.y, 0.0f,
rightVec.z, upVec.z, -forwardVec.z, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f
);
glm::mat4 viewMatrix2 = glm::mat4(
1.0f, 0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f,
-m_Camera->GetPos().x,
-m_Camera->GetPos().y,
-m_Camera->GetPos().z,
1.0f
);
return viewMatrix1 * viewMatrix2;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79218842/hardcoding-light-direction-in-my-fragment-shader[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия