Прежде всего, я хочу извиниться за такой длинный вопрос.Вам не нужно читать это.Вы можете сразу перейти к части questions , а затем при необходимости искать детали (я постарался предоставить как можно больше информации, потому что по моему опыту слишком много кода лучше, чем слишком мало).Итак, ...
Я немного озадачен обмоткой треугольника и преобразованиями, которые, как мне показалось, я понял.Я пытаюсь нарисовать куб, который определяется следующим образом:
const float a = 0.5f; //half of the cube side length
float positions[nComponents] =
{
//front face
-a, -a, -a,
a, -a, -a,
a, a, -a,
-a, -a, -a,
a, a, -a,
-a, a, -a,
//back face
-a, -a, a,
a, a, a,
a, -a, a,
-a, -a, a,
-a, a, a,
a, a, a,
//up face
-a, a, -a,
a, a, -a,
a, a, a,
-a, a, -a,
a, a, a,
-a, a, a,
//down face
-a, -a, -a,
a, -a, a,
a, -a, -a,
-a, -a, -a,
-a, -a, a,
a, -a, a,
//right face
a, -a, -a,
a, -a, a,
a, a, a,
a, -a, -a,
a, a, a,
a, a, -a,
//left face
-a, -a, -a,
-a, a, a,
-a, -a, a,
-a, -a, -a,
-a, a, -a,
-a, a, a,
};
И это предполагаемые цвета моих лиц:
float face_colors[nFaces * dim] =
{
1,0,0, //front RED
1,1,1, //back WHITE
0,0,1, //up BLUE
0,1,1, //down SKY BLUE
0,1,0, //right GREEN
1,1,0, //left YELLOW
};
Как вы можете видеть из комментариев, яиспользуйте термины вверх, вниз, влево, вправо и т. д. Эти слова приобретают смысл, если предположить, что мы смотрим на куб с позиции, скажем, (0, 0, -3a)
в мировых координатах.Теперь, как я понимаю, передние грани моего куба намотаны против часовой стрелки (то есть, если мы посмотрим на куб с любой позиции вне его и перечислим вершины в треугольниках, которые мы видим, мы получим намотку против часовой стрелки),
Итак, мне нужно 1. Включить отбраковку.2. Скажите, что против часовой стрелки - передняя поверхность. 3. Отберите заднюю поверхность.Вот код для этого:
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glFrontFace(GL_CCW);
glCullFace(GL_BACK);
Моя матрица проекции - это матрица перспективной проекции, а матрица modelView - это просто матрица LookAt.Они передаются в виде униформы в вершинный шейдер.
ProjectionMatrix = glm::perspective(45.0f, (float)w/h, 0.1f, 100.0f);
glm::vec3 center(0.0f, 0.0f, 0.0f);
glm::vec3 eye(1.0f, 2.0f, -3.0f);
glm::vec3 up(0.0f, 1.0f, 0.0f);
ModelViewMatrix = glm::lookAt(eye, center, up);
glUniformMatrix4fv(locP, 1, false, glm::value_ptr(ProjectionMatrix));
glUniformMatrix4fv(locMV, 1, false, glm::value_ptr(ModelViewMatrix));
Мой вершинный шейдер определяется следующим образом:
#version 400
layout(location = 0) in vec4 vVertex;
layout(location = 1) in vec4 vColor;
uniform mat4 P;
uniform mat4 MV;
out vec4 vFragColor;
void main(void)
{
vFragColor = vColor;
gl_Position = P * MV * vVertex;
}
Мой фрагментный шейдер тривиален - он просто выводит интерполированный цвет.
Теперь ... вот вывод, который я получаю:
Если я изменю glFrontFace(GL_CCW);
на glFrontFace(GL_CW);
, или, альтернативно, изменим glCullFace(GL_BACK)
наglCullFace(GL_FRONT)
, я получаю ожидаемый (по крайней мере, более ожидаемый, чем предыдущий, см. Второй и третий вопросы) рендеринг:
Я вижу здесь три проблемы, каждая из которых описана ввопрос:
АКТУАЛЬНЫЕ ВОПРОСЫ:
Q1: Почему обмотка обратная той, которую я намеревался?Разве я не наматывал вершины против часовой стрелки для передних граней?
Q2 Почему мое "левое" лицо и "правое" лицо поменялись местами?Левое лицо должно было быть желтым, а правое зеленым, а не наоборот!Что не так с моим преобразованием?
Q3 Там - это что-то не так с моим преобразованием, потому что координата x моего вектора глаза положительна, что означает, что я должен увидеть немногоПравая сторона, не немного левой стороны!
Я задавал эти вопросы вместе, потому что я думаю, что они все связаны, и, возможно, с чем-то очень базовым, что мне не хватает.Большое спасибо, что нашли время прояснить эти вещи.