2015-09-07 4 views
1

Я пытаюсь нарисовать 2D-накладку поверх 3D-модели, где она должна появиться в левом углу экрана, но я получаю прямоугольник, который я Я пытаюсь рисовать, размещается в середине 3D-модели. Ниже вы можете увидеть скриншот моего вывода. enter image description hereOpenGL - неправильный рисунок 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); 
+0

Просто нарисуйте 3D-сцену, а затем нарисуйте интерфейс без матричных преобразований относительно камеры. Нам нужно увидеть больше кода, чтобы действительно знать, что происходит не так. – CoffeeandCode

+0

Кроме того, старый бетон? или вы можете переключиться на * как минимум * 2.1 и шейдеры? – CoffeeandCode

+0

@CoffeeandCode - я редактировал свой пост выше. См. Дополнительную информацию. – zyneragetro

ответ

2

Ваши проекционные матрицы выглядят правильно для меня. Похоже, что для вашего наложения были использованы матрицы, которые использовались для рисования Spanch Bob. Проверка:

  1. Сформированы оба шейдера для наложения. glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
  2. Оверлейная программа правильно связана. glGetProgramiv(program, GL_LINK_STATUS, &status);
  3. Убедитесь, что вы используете правильную программу. glGetIntegeriv(GL_CURRENT_PROGRAM, &program)
  4. glGetUniformLocation(program, "yourMVPmatrix") возвращает правильный идентификатор.

Обратите внимание, что если какая-либо программа не была должным образом связана, OpenGL не будет гоняться за ошибкой на любом из glDraw*.

+0

Просто пояснение для первой точки, будет ли другой шейдер для наложения? В настоящее время я просто использую шейдер, используемый для 3d-модели. – zyneragetro

+0

Ну, тогда вы должны «glUniform *» обновить свою MVP-матрицу как минимум. (Я не вижу такого вызова в ваших списках) – ivaigult

+0

Я использую glUniform для обновления MVP-матрицы, но на данный момент я упростил работу с помощью другого шейдера. – zyneragetro

 Смежные вопросы

  • Нет связанных вопросов^_^