2016-04-04 233 views
2

我想在使用openGL的窗口上顯示紋理。但是,紋理僅映射到窗口的左下角,並被切斷! outputopenGL紋理映射-c

這裏是我的代碼:

質地:

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

四:

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

我想紋理映射到我的窗口。我的窗口和紋理都有1024x768的大小。我做錯了什麼?如果我註釋掉glViewport,紋理將被映射到右上角。

+0

任何具體的理由給-ve值指定左下角的視口?你爲什麼不給0,0呢? – Raki

+0

,因爲給0,0或評論它,我們會給我這個[圖片](http://i.imgur.com/USHBwqc.png)。我想要這樣的東西:[image2](http://i.imgur.com/f3DlLVO.png) – user3335341

+0

評論glviewport給你的行爲的原因是,視口(和剪刀箱)被設置爲幀緩衝尺寸(0, 0,1024,768)首次使上下文變爲當前。 – Andreas

回答

0

您的視口參數無效爲您的特定願望(x,y的負值)。您也可能沒有指定將局部座標映射到像素的投影/模型視圖矩陣對(至少不在所示的代碼中),但您傳遞給glVertex的座標看起來就像是要處理像素。

+0

視口值必須是正面的嗎? – BDL

+1

@BDL:不是我所知道的。但是,如果OP希望紋理完全可見並且不會裁剪到左下角,則所使用的值對於此特定用途無效。 – datenwolf

+0

@BDL沒有限制。閱讀標準:https://www.opengl.org/sdk/docs/man/html/glViewport.xhtml – Andreas

1

您的圖像被切斷的原因是提供給glViewport的值。該函數指定渲染應該在屏幕的哪個區域進行。因此,如果將x值設置爲-511,將寬度設置爲1025,則繪圖將從像素-511至514發生,這正是您所看到的。

實際上想要將圖像呈現到所需位置的是投影(很可能是正字法投影),它將輸入座標映射到適當的歸一化設備座標(NDC)。不使用投影時OpenGL在NDC座標系中的座標範圍從-1到1,而不是像你所假定的那樣。