Прежде чем начать свой вопрос, немного фона. Я начал изучать OpenGL не так давно, и я узнал большую часть того, что знаю об этом here. Я только что получил прошлое 2 учебника, и да, я знаю, что мне, в конце концов, придется узнать о матрицах, но пока ничего фантастического. Так что давайте продолжим.OpenGL weird vertex shader issue
Итак, я немного упростил свою программу, но не беспокойтесь, она по-прежнему воссоздает ту же проблему. Для моего примера мы делаем фиолетовый треугольник. Я делаю обычно, инициализацию GLFW и GLEW, и создать окно со следующими подсказками:
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_SAMPLES, 8);
А потом я создаю мое окно:
GLFWwindow* Window = glfwCreateWindow(640, 480, "Foo", NULL, NULL);
glfwMakeContextCurrent(Window);
glfwSwapInterval(0);
Это мои вершины:
float Vertices[] = {
0.0f, 0.5f, 1.0f,
0.5f, -0.5f, 1.0f,
-0.5f, -0.5f, 1.0f
};
Мои шейдеры:
const char* vertex_shader =
"#version 330\n"
"in vec3 vp;"
"void main() {"
" gl_Position = vec4 (vp, 1.0);"
"}";
const char* fragment_shader =
"#version 330\n"
"out vec4 frag_colour;"
"void main() {"
" frag_colour = vec4 (0.5, 0.0, 0.5, 1.0);"
"}";
Все хорошо, я скомпилирую всю программу и вуаля! Фиолетовый треугольник!
Желтый счетчик на верхнем левом углу находится FRAPS, кстати.
Итак, в любом случае, мой мозг получает это awesome идея (не совсем), что делать, если я это делаю: vec4(vp, vp.z)
в вершинном шейдере? Тогда я мог бы получить вид глубины, просто изменив свои z в моем буфере, подумал я. Обратите внимание, что я не думал о замене перспективной матрицы, это был просто своего рода эксперимент. Пожалуйста, ненавидят меня.
И это сработало, изменив значения, я получил что-то такое, что смотрел как глубина, так как в ней было похоже, что она все глубже проникает вдаль. Посмотрите, я изменил верхнюю вершину от 1,0 до 6,0:
Теперь вот проблема: я изменить значение 999999999 (9 девяток), и я получаю это:
Кажется работать. Небольшое отличие от z = 6. Измените его на 999999999999999999999999 (24 девятки)? Нет разницы. Посмотрите сами:
Так что это странно. Большая разница в цифрах, но небольшая разница визуально. Может быть, вопросы точности? Несколько 24 девятки на 349, и я получаю тот же результат. Кикер: Умножьте 24 девятки на 350, и треугольник исчезнет. Это для меня неожиданность, потому что я думал, что изменение будет видимым и постепенным. Это явно не было. Однако изменение w вручную в вершинном шейдере вместо выполнения vp.z
, похоже, дает постепенный результат, а не просто внезапно исчезает. Надеюсь, кто-то может пролить свет на это. Если вы добрались до этого, вы один потрясающий человек, который читает всю мою дерьмо, потому что я благодарю вас.
Это имеет смысл, спасибо. Я предполагаю, что вершина исчезает, когда я ударяю по плавающей запятой? – Nooble
Наверное, нет. Даже если точность с плавающей запятой вызывает неточные результаты (даже если они находятся за пределами экрана), у вас все еще есть две вершины внутри экрана, и растеризатор создаст правильный треугольник из этих вершин. Не уверен, что произойдет, если у вас есть NaN или бесконечность. –
Тогда почему оно исчезает? – Nooble