Question

Je suis en train de rendre des mailles avec projection Frustum sur le dessus d'une image d'arrière-plan (projection orthographiques). Peu importe ce que je fais, l'image de fond continue à être au-dessus de la scène (cachant les mailles).

J'ai essayé un petit test - quand je les ai tous les deux avec la rendais même matrice de projection étaient la dans l'ordre - l'image de fond était derrière les mailles

.

Ce sont les matrices de projection et init de profondeur Tampon:

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);

Je nettoie les tampons avec: glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

Une dernière chose .. Lorsque je désactiver GL_DEPTH_TEST, les mailles sont attirés en face de l'image d'arrière-plan parce que l'arrière-plan est appelé premier ..

Je ne peux pas dire qui, la profondeur-tampon ou les matrices de projection, ce qui provoque ce problème .. Les valeurs des matrices avec ScreenWidth = 960 et ScreenHeigth = 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);

Qu'est-ce que je fais mal? Amir.

Edit: Ce que je peins les images avec la projection orthographiques:

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);

et voilà comment je dessine les mailles avec la projection de cône tronqué:

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);
Était-ce utile?

La solution

Si je comprends bien, vous voulez faire les choses séparées suivantes:

  • Dessine un quad en plein écran avec une texture sur elle
  • Faites quelque chose pour que ce quad ne sont pas prises en compte dans le tampon z-
  • Ensuite, dessiner un maillage (avec projection quelle que soit, vue et matrices de modèle que vous voulez) sur le dessus de celui-ci.

« Quand je GL_DEPTH_TEST désactiver, les mailles sont en cours d'élaboration devant l'image d'arrière-plan parce que l'arrière-plan est appelé d'abord .. » -> Je suppose que vous pouvez dessiner à la fois votre quad et notre maillage fullscreen séparément. Donc, configuration VBO, des matrices, des textures et des choses sont bonnes. Il est uniquement le point # 2 qui manque.

  • Solution 1:

Effacer tout pour un nouveau cadre, comme d'habitude. Z-buffer sera partout 1,0

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

Dessine l'arrière-plan. Votre mémoire tampon de couleur est OK, mais il téter parce que le tampon z contiendra la profondeur de votre quad, disons 0,5. Alors, quand vous rendrez votre maillage, vous devez être assez chanceux pour que les nouvelles valeurs de profondeur sont inférieures à 0,5, ou le test de profondeur échouera. Mais nous pouvons faire quelque chose à ce sujet: il suffit de supprimer le z-tampon à nouveau à 1,0:

glClear(GL_DEPTH_BUFFER_BIT);

Maintenant, dessiner l'autre maille comme d'habitude. La matrice de ModelViewProjection a changé, mais OpenGL ne sait pas que: tout ce qu'il sait est que la profondeur est de 1,0 partout. Ainsi, le test de profondeur sera toujours réussir votre maillage. Vous pourrez ainsi voir votre mesh, où il devraient être, avec des valeurs correctes z, et le quad fond partout ailleurs.

  • Solution 2

Ici, vous empêchez les valeurs de profondeur beeing mis à jour lorsque de la quad plein écran est dessiné.

Désactiver les écritures sur la mémoire tampon de profondeur:

glDepthMask(GL_FALSE);

Dessine l'arrière-plan. un tampon de couleur sera OK, et z-buffer contient encore 1,0 partout, comme indiqué par glClear () quelques lignes ci-dessus.

réactivez écrit sur le tampon de profondeur:

glDepthMask(GL_TRUE);

Dessine l'autre maillage. Comme précédemment, z-buffer sera 1,0 partout, comme si vous aviez appelé glClear (), donc si votre maillage est dans le tronc de cône (il doit évidemment être), son z sera, disons, 0,5, et il sera tirer.

  • Solution 3

Il suffit de tirer votre fond loin de la caméra, à proximité du plan de délimitation loin. (À savoir avec une grande composante Z). Son sera 0,9999 ou quelque chose comme composants z que, et comme avant, filet rendra Allright.

Je vraiment, vraiment ne peut pas expliquer plus en détail. Désolé si elle est toujours pas clair, j'ai essayé de reformuler chaque idée de plusieurs façons, ne peut rien faire de plus.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top