Как переместить вершинное преобразование в вершинный шейдер
Мне нужна ваша помощь! Я пытаюсь переместить часть преобразования вершины из кода процессора в вершинный шейдер, вот код cpp преобразования вершины:
//calculate the transform matrix of a refelcting surface
//@point: a point on the surface
//@normal: the normalized normal of the surface
//@return: the transform matrix
glm::mat4 flatReflect(glm::vec3& point, glm::vec3& normal)
{
glm::vec4 R = glm::vec4(point,1);
glm::vec4 N = glm::vec4(normal,0);
GLfloat d = glm::dot(R,N);
glm::mat4 result;
result[0][0] = 1 - 2* N.x*N.x;
result[0][1] = -2*N.x*N.y;
result[0][2] = -2*N.x*N.z;
result[0][3] = -2*N.x*d;
result[1][0] = result[0][1];
result[1][1] = 1 - 2*N.y*N.y;
result[1][2] = -2*N.y*N.z;
result[1][3] = -2*N.y*d;
result[2][0] = result[0][2];
result[2][1] = result[1][2];
result[2][2] = 1-2*N.z*N.z;
result[2][3] = -2*N.z*d;
result[3][0] = 0;
result[3][1] = 0;
result[3][2] = 0;
result[3][3] = 1;
return result;
}
Любая идея? Заранее спасибо!
1 ответ
Решение
Вы можете перевести это довольно легко. Во-первых, чтобы перевести эти строки:
glm::vec4 R = glm::vec4(point,1);
glm::vec4 N = glm::vec4(normal,0);
GLfloat d = glm::dot(R,N);
Эти типы и функции изначально существуют в GLSL и не нуждаются в квалификации, поэтому:
vec4 R = vec4(point, 1.0); // An explicit decimal is important; some drivers do
vec4 N = vec4(normal, 0.0); // not perform implicit coercions.
float d = dot(R, N);
Построение матрицы немного отличается; вместо того, чтобы объявлять матрицу и устанавливать ее элементы, вы можете создавать и возвращать все сразу, например (для единичной матрицы):
return mat4(1.0, 0.0, 0.0, 0.0,
0.0, 1.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0);
Доступ к элементам векторов работает так же, как в C++. Зная это, остальная часть перевода должна быть легкой. Удачи!