Я слежу за этим сайтом, чтобы изучить трассировку лучей с помощью компьютерных шейдеров: https://github.com/LWJGL/lwjgl3-wiki/wiki/2.6.1.-Ray-tracing-with-OpenGL-Compute-Shaders-%28Part-I%29
Мой вопрос, в учебнике подробно описана процедура получения перспективной проекции. Я думаю, что правильно выполнил его шаги, но получаю неправильный результат и считаю, что допустил ошибку в своих матричных вычислениях.
Мой код для перспективной проекции
//Getting the perspective projection using glm::perspective
glm::mat4 projection = glm::perspective(60.0f, 1024.0f/768.0f, 1.0f, 2.0f);
//My Camera Position
glm::vec3 camPos=glm::vec3(3.0, 2.0, 7.0);
//My View matrix using glm::lookAt
glm::mat4 view = glm::lookAt(camPos, glm::vec3(0.0, 0.5, 0.0),glm::vec3(0.0, 1.0, 0.0));
//Calculating inverse of the view*projection
glm::mat4 inv = glm::inverse(view*projection);
//Calculating the rays from camera position to the corners of the frustum as detailed in the site.
glm::vec4 ray00=glm::vec4(-1, -1, 0, 1) * inv;
ray00 /= ray00.w;
ray00 -= glm::vec4(camPos,1.0);
glm::vec4 ray10 = glm::vec4(+1, -1, 0, 1) * inv;
ray10 /= ray10.w;
ray10 -= glm::vec4(camPos,1.0);
glm::vec4 ray01=glm::vec4(-1, 1, 0, 1) * inv;
ray01 /= ray01.w;
ray01 -= glm::vec4(camPos,1.0);
glm::vec4 ray11 = glm::vec4(+1, +1, 0, 1) * inv;
ray11 /= ray11.w;
ray11 -= glm::vec4(camPos,1.0);
Результат вышеуказанных преобразований:
[! [введите описание изображения здесь] [1]] [1]В качестве дополнительной информации я вызываю мои вычислительные шейдеры, используя
//Dispatch Shaders.
glDispatchCompute ((GLuint)1024.0/16, (GLuint)768.0f/8 , 1);
Я также передаю значения в шейдер, используя
//Querying the location for ray00 and assigning the value. Similarly for the rest
GLuint ray00Id = glGetUniformLocation(computeS, "ray00");
glUniform3f(ray00Id, ray00.x, ray00.y, ray00.z);
GLuint ray01Id = glGetUniformLocation(computeS, "ray01");
glUniform3f(ray01Id, ray01.x, ray01.y, ray01.z);
GLuint ray10Id = glGetUniformLocation(computeS, "ray10");
glUniform3f(ray10Id, ray10.x, ray10.y, ray10.z);
GLuint ray11Id = glGetUniformLocation(computeS, "ray11");
glUniform3f(ray11Id, ray11.x, ray11.y, ray11.z);
GLuint camId = glGetUniformLocation(computeS, "eye");
glUniform3f(camId, camPos.x, camPos.y, camPos.z);
Обновленный ответ после предложения derhass.
Мое изображение теперь выглядит так:
Последнее изображение
В библиотеке glm используются стандартные соглашения о матрицах OpenGL. Это означает, что матрицы создаются в порядке умножения. Matrix * Vector
в уме. Поэтому следующий код неверен:
//Calculating inverse of the view*projection
glm::mat4 inv = glm::inverse(view*projection);
Состав матрицы вида (трансформация из мирового пространства в пространство глаза) и матрицы проекции (трансформация из пространства глаза в пространство клипа) projection * view
не view * projection
как вы выразились (что применило бы проекцию перед видом).
Других решений пока нет …