某些 window 尺寸的 OpenGL 图像无法正确显示
OpenGL images not displaying properly with some window sizes
我是 OpenGL 新手,正在尝试显示图像。我已经完成 "Load image from file" 部分,现在正尝试将其绑定到我的形状 (GL_TRIANGLES)。有时图像会正确显示,但有时不会。我已经意识到它取决于 window 的大小,所以如果我调整 window 的大小,我可以获得清晰的图像。以下是屏幕外观的一些屏幕截图:
工作:
损坏:
这是我的绘制循环:
void display() {
// tick the frame counter
frame++;
start_time = clock();
// update screen
int width = glutGet(GLUT_WINDOW_WIDTH);
int height = glutGet(GLUT_WINDOW_HEIGHT);
update_screen(width, height);
// clear screen
glClearColor(0, 0, 0, 1);
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, png::get_textures()[1]);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
glBegin(GL_TRIANGLES);
glVertex2f(1000, 1000);
glVertex2f(0, 1000);
glVertex2f(0, 0);
glVertex2f(1000, 1000);
glVertex2f(1000, 0);
glVertex2f(0, 0);
glEnd();
glDisable(GL_TEXTURE_2D);
glPopMatrix();
glFlush();
glutSwapBuffers();
elapsed_time = ((clock() - start_time) / (double(CLOCKS_PER_SEC) / 10000));
// tick all entities
player.tick(elapsed_time);
glutPostRedisplay();
}
此外,如果我删除 glEnable(GL_TEXTURE_GEN_S) 或 glEnable(GL_TEXTURE_GEN_T);或两者兼而有之,图像完全变成蓝色或灰色。
编辑:哦,我正在使用 PNG 文件,以防万一。
嗯,我觉得不好意思!
我忘了添加 glTexCoord2f...
听听我的新文件,以防其他人忘记了他们的大脑。 :)
void display() {
// tick the frame counter
frame++;
start_time = clock();
// update screen
int width = glutGet(GLUT_WINDOW_WIDTH);
int height = glutGet(GLUT_WINDOW_HEIGHT);
update_screen(width, height);
//glMatrixMode(GL_MODELVIEW);
//glLoadIdentity();
// clear screen
glClearColor(0, 0, 0, 1);
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, png::get_textures()[3]);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex2f(0, 0);
glTexCoord2f(1, 0); glVertex2f(1000, 0);
glTexCoord2f(1, 1); glVertex2f(1000, 1000);
glTexCoord2f(0, 1); glVertex2f(0, 1000);
glEnd();
glDisable(GL_TEXTURE_2D);
glPopMatrix();
glFlush();
glutSwapBuffers();
elapsed_time = ((clock() - start_time) / (double(CLOCKS_PER_SEC) / 10000));
// tick all entities
player.tick(elapsed_time);
glutPostRedisplay();
}
我是 OpenGL 新手,正在尝试显示图像。我已经完成 "Load image from file" 部分,现在正尝试将其绑定到我的形状 (GL_TRIANGLES)。有时图像会正确显示,但有时不会。我已经意识到它取决于 window 的大小,所以如果我调整 window 的大小,我可以获得清晰的图像。以下是屏幕外观的一些屏幕截图:
工作:
损坏:
这是我的绘制循环:
void display() {
// tick the frame counter
frame++;
start_time = clock();
// update screen
int width = glutGet(GLUT_WINDOW_WIDTH);
int height = glutGet(GLUT_WINDOW_HEIGHT);
update_screen(width, height);
// clear screen
glClearColor(0, 0, 0, 1);
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, png::get_textures()[1]);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
glBegin(GL_TRIANGLES);
glVertex2f(1000, 1000);
glVertex2f(0, 1000);
glVertex2f(0, 0);
glVertex2f(1000, 1000);
glVertex2f(1000, 0);
glVertex2f(0, 0);
glEnd();
glDisable(GL_TEXTURE_2D);
glPopMatrix();
glFlush();
glutSwapBuffers();
elapsed_time = ((clock() - start_time) / (double(CLOCKS_PER_SEC) / 10000));
// tick all entities
player.tick(elapsed_time);
glutPostRedisplay();
}
此外,如果我删除 glEnable(GL_TEXTURE_GEN_S) 或 glEnable(GL_TEXTURE_GEN_T);或两者兼而有之,图像完全变成蓝色或灰色。
编辑:哦,我正在使用 PNG 文件,以防万一。
嗯,我觉得不好意思!
我忘了添加 glTexCoord2f...
听听我的新文件,以防其他人忘记了他们的大脑。 :)
void display() {
// tick the frame counter
frame++;
start_time = clock();
// update screen
int width = glutGet(GLUT_WINDOW_WIDTH);
int height = glutGet(GLUT_WINDOW_HEIGHT);
update_screen(width, height);
//glMatrixMode(GL_MODELVIEW);
//glLoadIdentity();
// clear screen
glClearColor(0, 0, 0, 1);
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, png::get_textures()[3]);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex2f(0, 0);
glTexCoord2f(1, 0); glVertex2f(1000, 0);
glTexCoord2f(1, 1); glVertex2f(1000, 1000);
glTexCoord2f(0, 1); glVertex2f(0, 1000);
glEnd();
glDisable(GL_TEXTURE_2D);
glPopMatrix();
glFlush();
glutSwapBuffers();
elapsed_time = ((clock() - start_time) / (double(CLOCKS_PER_SEC) / 10000));
// tick all entities
player.tick(elapsed_time);
glutPostRedisplay();
}