2016-04-04 203 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,而不是像你所假定的那样。