Я пытаюсь нарисовать 2D-накладку поверх 3D-модели, где она должна появиться в левом углу экрана, но я получаю прямоугольник, который я Я пытаюсь рисовать, размещается в середине 3D-модели. Ниже вы можете увидеть скриншот моего вывода. OpenGL - неправильный рисунок 2D-наложения поверх 3D-сцены
Моя установка для ортогональной матрицы, как этот
2/(right - left), 0, 0, 0,
0, 2/(top - bottom), 0, 0,
0, 0, 2/(far - near), 0,
-(right + left)/(right - left), -(top + bottom)/(top - bottom), -(far + near)/(far - near), 1
Для шагов о том, как я могу нарисовать 2D наложения поверх 3D, я последовал this ответ. Также похоже, что прямоугольник не является наложением вообще на основе вывода. Надеюсь, что вы можете мне помочь :)
EDIT:
Это как я рисую модель. Обратите внимание, что этот блок кода будет использоваться дважды, чтобы нарисовать 2 модели
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
GLuint buffer;
glGenBuffers(1, &buffer);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, cc * sizeof(GLfloat), v, GL_STATIC_DRAW);
GLuint tcbuffer;
glGenBuffers(1, &tcbuffer);
glBindBuffer(GL_ARRAY_BUFFER, tcbuffer);
glBufferData(GL_ARRAY_BUFFER, tcc * sizeof(GLfloat), vt, GL_STATIC_DRAW);
GLuint ncbuffer;
glGenBuffers(1, &ncbuffer);
glBindBuffer(GL_ARRAY_BUFFER, ncbuffer);
glBufferData(GL_ARRAY_BUFFER, ncc * sizeof(GLfloat), vn, GL_STATIC_DRAW);
glEnableVertexAttribArray(m_vert);
glBindBuffer(GL_ARRAY_BUFFER, vbufferid);
glVertexAttribPointer(m_vert, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(m_texcoord);
glBindBuffer(GL_ARRAY_BUFFER, tcbufferid);
glVertexAttribPointer(m_texcoord, 2, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(m_color);
glBindBuffer(GL_ARRAY_BUFFER, cbufferid);
glVertexAttribPointer(m_color, 4, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(m_vertexnormal);
glBindBuffer(GL_ARRAY_BUFFER, ncbufferid);
glVertexAttribPointer(m_vertexnormal, 3, GL_FLOAT, GL_FALSE, 0, 0);
glDrawArrays(GL_TRIANGLES, 0, vc);
И для установки выступов.
Matrix44 fov_matrix(double fov, double aspect, double near, double far) {
var yScale = 1.0/Math.tan(fov/2);
var xScale = yScale/aspect;
return(Matrix44.for_values(
xScale, 0, 0, 0,
0, yScale, 0, 0,
0, 0, (far + near)/(near - far), -1,
0, 0, 2 * far * near/(near - far), 0
));
}
Matrix44 orthographic_matrix(double left, double right, double bottom, double top, double near, double far) {
return(Matrix44.for_values(
2/(right - left), 0, 0, 0,
0, 2/(top - bottom), 0, 0,
0, 0, 2/(far - near), 0,
-(right + left)/(right - left), -(top + bottom)/(top - bottom), -(far + near)/(far - near), 1
));
}
var projm = fov_matrix(MathConstant.M_PI/4, get_aspect_ratio(), 1.0, 100.0);
var orthoprojm = orthographic_matrix(0.0, 800, 600, 0.0, -100.0, 1.0);
Просто нарисуйте 3D-сцену, а затем нарисуйте интерфейс без матричных преобразований относительно камеры. Нам нужно увидеть больше кода, чтобы действительно знать, что происходит не так. – CoffeeandCode
Кроме того, старый бетон? или вы можете переключиться на * как минимум * 2.1 и шейдеры? – CoffeeandCode
@CoffeeandCode - я редактировал свой пост выше. См. Дополнительную информацию. – zyneragetro