2016-04-04 23 views
2

Pencerede dokuyu openGL kullanarak görüntülemeye çalışıyorum. Ancak, doku sadece penceremin sol alt tarafına haritalanıyor ve kesiliyor! outputopenGL Doku eşleme - c

İşte benim kodudur:

Doku:

GLuint textureID[1]; 
GLubyte Image[1024*768*4]; 
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
glGenTextures(1,textureID); 
glBindTexture(GL_TEXTURE_2D, textureID[0]); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexImage2D(GL_TEXTURE_2D, 0, 3, 1024, 768, 0, GL_RGBA, GL_UNSIGNED_BYTE, Image); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
glEnable(GL_TEXTURE_GEN_S); 
glEnable(GL_TEXTURE_GEN_T); 

Quad:

glPushMatrix(); 
glTranslatef(0, 0.0, -1.1); 

glMaterialf(GL_FRONT, GL_SHININESS, 30.0); 
glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, textureID[0]); 
glViewport(-511,-383,1025,768); 

glBegin(GL_QUADS); 
glTexCoord2d(0.0, 0.0); glVertex2f(0.0, 0.0); 
glTexCoord2d(1.0, 0.0); glVertex2f(1024.0, 0.0); 
glTexCoord2d(1.0, 1.0); glVertex2f(1024.0, 768.0); 
glTexCoord2d(0.0, 1.0); glVertex2f(0.0, 768.0); 
glEnd(); 

glDisable(GL_TEXTURE_2D); 
glPopMatrix(); 
glFlush(); 

benim penceresine dokusunu haritasına çalışıyorum. Hem pencerem hem de doku 1024x768 boyutlarında. Neyi yanlış yaptım? glViewport'u açıklarsam, doku sağ üstte eşleştirilir.

+0

Görünümün sol alt köşesini belirtmede -ve değerlerini vermek için belirli bir neden var mı? neden orada 0,0 vermiyorsun? – Raki

+0

çünkü 0,0 veya yorum yapıyoruz, bunu bana vereceğiz [image] (http://i.imgur.com/USHBwqc.png). Şöyle bir şey istiyorum: [image2] (http://i.imgur.com/f3DlLVO.png) – user3335341

+0

glviewport'a yorum yapmanın nedeni, bu davranışın, viewport'un (ve scissorbox) framebuffer boyutlarına (0, 0,1024,768) ilk defa bağlam güncel hale getirildi. – Andreas

cevap

0

Görüşün parametreleriniz (x, y için negatif değerler) için numaralı telefon numarasından geçersiz. Muhtemelen yerel koordinatları piksellerle eşleştiren bir projeksiyon/model görüntüleme matrisi çifti belirlemediniz (en azından gösterilen kodda değil), ancak glVertex'e ilettiğiniz koordinatlar pikselleri ele almak istediğiniz gibi görünür.

+0

Vizör değerlerinin pozitif olması gereken bir kısıtlama var mı? – BDL

+1

@BDL: Bildiğim kadarıyla değil. Ancak OP, dokusunun tamamen görünür olmasını ve sol alt köşeye kırpılmasını istemiyorsa, bu özel kullanım için kullanılan değerler geçersizdir. – datenwolf

+0

@BDL Kısıtlama yok. Standardı okuyun: https://www.opengl.org/sdk/docs/man/html/glViewport.xhtml – Andreas

1

Görüntünüzün kesilmesinin nedeni glViewport ürününe verilen değerlerdir. Bu işlev, görüntülemenin hangi alana gitmesi gerektiğini belirtir. Yani x-değerini -511'e ve genişliği 1025'e ayarlarsanız, çizim, tam olarak gördüğünüz piksel -511'den 514'e kadar olur.

Görüntüyü istediğiniz konuma getirmek istediğiniz şey, koordinatlarını uygun normalleştirilmiş aygıt koordinatlarına (NDC) bağlamanızı sağlayan bir projeksiyondur (büyük olasılıkla ortografik olanıdır). Projeksiyonları kullanmadığınız zaman OpenGL, bu NDC koordinatlarında, her bir eksende -1'den 1'e kadar, piksel koordinatlarında varsaydığınız gibi çalışmamaktadır.