Жесткое кодирование направления света в моем фрагментном шейдереC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Жесткое кодирование направления света в моем фрагментном шейдере

Сообщение 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;
}



Подробнее здесь: https://stackoverflow.com/questions/792 ... ent-shader
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»