我正在尝试使用openGL在窗口上显示纹理。但是,纹理只映射到我的窗口的左下角并且它被切断了! output
这是我的代码:
质地:
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 :(得分:1)
图像被切断的原因是提供给glViewport
的值。此函数指定渲染应该到屏幕的哪个区域。因此,如果您将x值设置为-511并将宽度设置为1025,则绘图将从像素-511到514进行,这正是您所看到的。
您实际想要将图像移动到所需位置的是投影(很可能是正交投影),它将输入坐标映射到相应的标准化设备坐标(NDC)。当不使用投影时,OpenGL在这个NDC坐标中工作,每个轴的范围从-1到1,而不是像你想象的那样,在像素坐标中。
答案 1 :(得分:0)
您的视口参数对于您的特定需求无效(x,y的负值)。您也可能没有指定将局部坐标映射到像素的投影/模型视图矩阵对(至少不是在显示的代码中),但是传递给glVertex的坐标看起来像是要处理像素。