Вопрос

Я пытаюсь отображать несколько сетки с фруктовой проекцией поверх фонового изображения (орфографическая проекция). Независимо от того, что я делаю, фоновое изображение продолжает находиться на вершине сцены (скрывая сетки).

Я попробовал небольшой тест - когда я сделал их обоим с той же проекционной матрицей, которая была в правильном порядке - фоновое изображение находилось за сетками.

Это проекционные матрицы и глубинный буферный инициатор:

glEnable(GL_DEPTH_TEST);
glClearDepthf( 1.0f );
glDepthFunc( GL_LEQUAL );
glDepthMask (GL_TRUE);

EGLConfig eglconfig;
EGLint const attrib_list[] = {
    EGL_DEPTH_SIZE, 16,
    EGL_NONE
};
EGLint numreturned;
CHECK(eglChooseConfig(esContext.eglDisplay, attrib_list, &eglconfig, 1, &numreturned) != EGL_FALSE);

float fieldOfView = 60.0;
float znear = 0.1f;
float zfar = 100000;
float size = (float)(znear * tanf((fieldOfView * M_PI /180.0f) / 2.0f)); 

m_orthoProjMatrix.loadOrtho(0, 
                            screenWidth, 
                            0, 
                            screenHeight, 
                            znear, 
                            zfar);

m_frustProjMatrix.loadFrustum(-size, 
                               size, 
                              -size / (screenWidth / screenHeight), 
                               size / (screenWidth / screenHeight), 
                               znear, 
                               zfar);

Я очищаю буферы с помощью: glclear (gl_color_buffer_bit | gl_depth_buffer_bit);

И последнее .. Когда я отключаю gl_depth_test, сетки рисуются перед фоновым изображением, потому что фон называется первым ..

Я не могу сказать, какие матрицы глубины или проекционные матрицы, вызывая эту проблему .. значения матриц с помощью Screenwidth = 960 и ScreenHeight = 640:

Orthographic Proj Matrix:
0.00208 0.00000 0.00000 -1.00000
0.00000 0.00313 0.00000 -1.00000
0.00000 0.00000 0.00000 -1.00000
0.00000 0.00000 0.00000  1.00000

Frustum Proj Matrix:
1.73205 0.00000  0.00000  0.00000
0.00000 2.59808  0.00000  0.00000
0.00000 0.00000 -1.00000 -0.20000
0.00000 0.00000 -1.00000  0.00000

Camera Settings:
Vector3 pos(0,10,50);
Vector3 at(0,0,0);
Vector3 up(0,1,0);
LookAt(pos,at,up);

Scene Settings:
Vector3 BackgroundImagePosition (0,0, -430);
Vector3 SomeMesh(0,0,0);

Что я делаю не так? Амир

Изменить: это то, как я рисую изображения с орфографической проекцией:

GLfloat verts[] = { 
image->x + image->width  , image->y                , image->z,
image->x + image->width  , image->y + image->height, image->z,
image->x                 , image->y + image->height, image->z,
image->x                 , image->y                , image->z};
Matrix4s mv(m_camera->getCameraViewMatrix());
Matrix4f proj(ResManPtr->getOrthoProjMatrix() * mv);
glUniformMatrix4fv(prog->getUniformLocation("u_projMatrix"), 1, GL_FALSE, &(*proj));
glActiveTexture(GL_TEXTURE0);
image->tex->bind();
glUniform1i(prog->getUniformLocation("s_texture"), 0);
glEnableVertexAttribArray(prog->getAttribLocation("a_position")); 
glVertexAttribPointer(prog->getAttribLocation("a_position"), 3, GL_FLOAT, GL_FALSE, 0, verts); 
glEnableVertexAttribArray(prog->getAttribLocation("a_texCoord"));
glVertexAttribPointer(prog->getAttribLocation("a_texCoord"), 2, GL_FLOAT, GL_FALSE, 0, m_texcoord);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);

И вот как я рисую сетки с помощью проекции «Пруста»:

Matrix4f mv(world->getCamera()->getCameraViewMatrix());
const btVector3& dir = getDirection();
Scalar xzAngle = atan2s(dir.x(), dir.z()) - (Scalar)M_PI_2;
btVector3 origin = getGhostObject()->getWorldTransform().getOrigin();
mv.applyTranslate(origin.x(), origin.y() - m_width/2, origin.z());
mv.applyRotateY(xzAngle);    
GLProgramPtr prog = ResManPtr->getProgramMap()[Consts::DEFAULT_PROGRAM_KEY];
Matrix4f proj(ResManPtr->getFrustProjMatrix() * mv);
glUniformMatrix4fv(prog->getUniformLocation("u_projMatrix"), 1, GL_FALSE, &(*proj));
glActiveTexture(GL_TEXTURE0);
m_texture->bind();  
glUniform1i(prog->getUniformLocation("s_texture") , 0);
m_model->render(frame_number);
Это было полезно?

Решение

Если я правильно понимаю, вы хотите сделать следующие отдельные вещи:

  • Нарисуйте полноэкранный квадроцикл с текстурой на нем
  • Сделайте что-нибудь, чтобы этот квадроцикл не учитывался в Z-буфере
  • После этого нарисуйте сетку (с любыми проекциями, представлением и матрицами моделей, которые вы хотите).

«Когда я отключаю gl_depth_test, сетки рисуются перед фоновым изображением, потому что фон называется первым ..» -> Я принимаю это, что вы можете нарисовать как свой полноэкранный квадроцикл и нашу сетку отдельно. Таким образом, настройка VBO, матрицы, текстуры и все хорошо. Это только момент № 2, который пропускает.

  • Решение 1:

Очистите все для нового кадра, как обычно. Z-буфер будет 1,0 везде

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

Нарисуйте фон. Ваш цветовой буфер в порядке, но он отстой, потому что Z-буфер будет содержать глубину вашего квадрата, скажем, 0,5. Поэтому, когда вы будете отображать свою сетку, вам придется посчастливиться, чтобы новые значения глубины меньше 0,5, или тест на глубину не удалось. Но мы можем что-то с этим сделать: просто проясните Z-буфер снова до 1.0:

glClear(GL_DEPTH_BUFFER_BIT);

Теперь нарисуйте другую сетку как обычно. Матрица ModelViewProjection изменилась, но OpenGL не знает, что: все, что он знает, это то, что глубина - 1,0 везде. Таким образом, тест на глубину всегда будет успешным для вашей сетки. Таким образом, вы увидите свою сетку, где она будет, с правильными значениями Z и фоновым квадроциклом везде.

  • Решение 2

Здесь вы предотвращаете обновление значений глубины, когда нарисовано полноэкранное квадроцикл.

Отключить пишет о буфере глубины:

glDepthMask(GL_FALSE);

Нарисуйте фон. Цветовой буфер будет в порядке, и Z-Buffer по-прежнему будет содержать 1,0 везде, как установлено Glclear () несколько линий выше.

Теперь Re-eneable пишет о буфере глубины:

glDepthMask(GL_TRUE);

Нарисуйте другую сетку. Как и прежде, Z-Buffer будет 1,0 везде, как если бы вы только что называли glclear (), поэтому, если ваша сетка находится в Frustum (это, очевидно, должно быть), его z будет, скажем, 0,5, и это будет быть нарисованным.

  • Решение 3

Просто нарисуйте свой фон вдали от камеры, рядом с самолетом дальнего отсечения. (т.е. с большим компонентом Z). Его Z-компонент будет 0,9999 или что-то в этом роде, и, как и раньше, Mesh будет все хорошо.

Я действительно, действительно не могу объяснить более подробно. Извините, если это все еще не ясно, я пытался переформулировать каждую идею несколькими способами, не могу ничего сделать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top