He is building a 2D Engine so I wanted to copy the Gerneral rendererapi Abstraction Stuff и, чем построить из него 3D -рендерер. Поэтому я сменил с матрицы ортогорафической проекции на перспективу (glm :: перспектива (Fov, ....)) и активированный Gl_depth_test и Opengls Backface отбор.
Код: Выделить всё
float vertices[8 * 3] =
{
-0.5f, -0.5f, 0.5f,
0.5f, -0.5f, 0.5f,
0.5f, 0.5f, 0.5f,
-0.5f, 0.5f, 0.5f,
-0.5f, -0.5f, -0.5f,
0.5f, -0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
-0.5f, 0.5f, -0.5f
};
uint32_t indices[36] =
{
0, 1, 2, 2, 3, 0,
1, 5, 6, 6, 2, 1,
7, 6, 5, 5, 4, 7,
4, 0, 3, 3, 7, 4,
4, 5, 1, 1, 0, 4,
3, 2, 6, 6, 7, 3
};
< /code>
Согласно следующей команде рендеринга: < /p>
glDrawElements(GL_TRIANGLES, vertexArray->GetIndexBuffer()->GetCount(), GL_UNSIGNED_INT, nullptr);
< /code>
и этот шейдер: < /p>
//vertex
#version 330 core
layout(location = 0) in vec3 a_Position;
uniform mat4 u_ViewProjection;
uniform mat4 u_Model;
void main()
{
gl_Position = u_ViewProjection * u_Model * vec4(a_Position, 1.0);
}
//fragment
#version 330 core
layout(location = 0) out vec4 color;
uniform vec4 u_Color;
void main()
{
color = u_Color;
}
< /code>
Странно происходит. Сначала все выглядит правильно
Но когда я двигаюсь так:
void ExampleLayer::DoCameraMove(wxl::KeyPressedEvent& evnt)
{
const float MOVE_SPEED = 30.f;
const float FORWARD_MOVE_SPEED = 1000.f;
const float ROTATION_SPEED = 10.f;
glm::vec3 position = m_Camera.GetPosition();
glm::vec3 lookDir = -m_Camera.GetLookDir();
glm::vec3 upDir = -m_Camera.GetUpDir();
glm::vec3 rightDir = glm::normalize(glm::cross(lookDir, -upDir));
//--Movement-----------------------------------------------------------------
if (evnt.GetKeyCode() == WXL_KEY_W) {
position += lookDir * FORWARD_MOVE_SPEED * m_TS;
}
if (evnt.GetKeyCode() == WXL_KEY_S) {
position -= lookDir * FORWARD_MOVE_SPEED * m_TS;
}
if (evnt.GetKeyCode() == WXL_KEY_A) {
position -= rightDir * MOVE_SPEED * m_TS;
}
if (evnt.GetKeyCode() == WXL_KEY_D) {
position += rightDir * MOVE_SPEED * m_TS;
}
if (evnt.GetKeyCode() == WXL_KEY_SPACE) {
position -= upDir * MOVE_SPEED * m_TS;
}
if (evnt.GetKeyCode() == WXL_KEY_LEFT_SHIFT) {
position += upDir * MOVE_SPEED * m_TS;
}
m_Camera.SetPosition(position);
//--Rotation------------------------------------------------------------------------
float rotationX = m_Camera.GetRotationX();
float rotationY = m_Camera.GetRotationY();
if (evnt.GetKeyCode() == WXL_KEY_UP) {
rotationX -= ROTATION_SPEED * m_TS;
}
if (evnt.GetKeyCode() == WXL_KEY_DOWN) {
rotationX += ROTATION_SPEED * m_TS;
}
if (evnt.GetKeyCode() == WXL_KEY_LEFT) {
rotationY += ROTATION_SPEED * m_TS;
}
if (evnt.GetKeyCode() == WXL_KEY_RIGHT) {
rotationY -= ROTATION_SPEED * m_TS;
}
m_Camera.SetRotation(rotationX, rotationY,
m_Camera.GetRotationZ());
}
Подробнее здесь: https://stackoverflow.com/questions/795 ... e-projecti