Domanda

Sto cercando di rendere alcune maglie con proiezione Frustum in cima ad un'immagine di sfondo (proiezione ortogonale). Non importa quello che faccio, l'immagine di sfondo continua ad essere in cima alla scena (che nasconde le maglie).

Ho provato un piccolo test - quando entrambi sono reso con la stessa matrice proiezione erano nel giusto ordine - l'immagine di sfondo era dietro le maglie

.

Queste sono le matrici di proiezione e la profondità init-Buffer:

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

sto pulendo i buffer con: glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

Un'ultima cosa .. Quando ho disabilitare GL_DEPTH_TEST, le maglie sono in preparazione di fronte l'immagine di sfondo, perché il fondo è chiamato prima ..

Non posso dire che, la profondità del buffer o le matrici di proiezione, che causano questo problema .. I valori delle matrici con screenwidth = 960 e 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);

Che cosa sto facendo di sbagliato? Amir.

Modifica: Questo come sto disegnando le immagini con la proiezione ortografica:

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

e questo è come sto disegnando le maglie con la proiezione tronco di cono:

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);
È stato utile?

Soluzione

Se ho capito bene, si vuole fare le seguenti cose separate:

  • Disegna un quad a schermo intero con una texture su di esso
  • Fare qualcosa in modo che questo quad non è preso in considerazione nella z-buffer
  • In seguito, disegnare una maglia (con tutto ciò che la proiezione, visualizzare e matrici modello che si desidera) su di esso.

"Quando ho disable GL_DEPTH_TEST, le maglie sono in preparazione di fronte l'immagine di sfondo, perché il fondo è chiamato prima .." -> Io lo prendo che è possibile disegnare sia il quad a schermo intero e la nostra maglia separatamente. Così VBO di impostazione, matrici, texture e roba sono tutti buoni. Il suo punto solo # 2 che manca.

  • Soluzione 1:

Cancella tutto per un nuovo telaio, come al solito. Z-buffer sarà 1.0 dappertutto

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

Disegna lo sfondo. Il buffer colore è OK, ma succhiare perché la z-buffer conterrà la profondità del tuo quad, diciamo 0.5. Così, quando si sarà rendere il vostro rete, si dovrà avere la fortuna in modo che i nuovi valori di profondità sono più piccoli di 0,5, o il test di profondità falliranno. Ma possiamo fare qualcosa al riguardo: è sufficiente cancellare la z-buffer di nuovo a 1.0:

glClear(GL_DEPTH_BUFFER_BIT);

Ora, disegnare l'altra rete come al solito. La matrice ModelViewProjection è cambiato, ma OpenGL non sa che: tutto quello che so è che profondità è 1.0 ovunque. Quindi il test di profondità sarà sempre successo per la vostra rete. Potrete così vedere il vostro rete dove si shoud essere, con Z-valori corretti, e lo sfondo quad ovunque.

  • Soluzione 2

Qui, si impedisce valori di profondità da beeing aggiornato quando il quad a schermo intero è disegnato.

scrive Disattiva il buffer di profondità:

glDepthMask(GL_FALSE);

Disegna lo sfondo. buffer colore sarà OK, e z-buffer conterrà ancora 1.0 dappertutto, come fissato dal glClear () poche righe sopra.

Ora riattivare scrive sul buffer di profondità:

glDepthMask(GL_TRUE);

Disegna l'altra rete. Come in precedenza, z-buffer sarà 1.0 ovunque, proprio come se si fosse appena chiamato glClear (), quindi se il vostro maglia è nel tronco di cono (che ha ovviamente essere), la sua z sarà, per esempio, 0.5, e sarà essere disegnato.

  • Soluzione 3

Basta disegnare lo sfondo lontano dalla fotocamera, in prossimità del piano di taglio lontano. (Vale a dire con una grande componente Z). La sua componente z sarà 0.9999 o qualcosa di simile, e proprio come prima, maglia renderà allright.

Io davvero, davvero non si può spiegare più in dettaglio. Scusate se non è ancora chiaro, ho cercato di riformulare ogni idea in diversi modi, non si può fare nulla di più.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top