Я пытаюсь создать приложение, которое все, что он делает, отображает полноэкранное изображение, а затем быстро прокручивает последовательность изображений (144hz). Я только начал смотреть на OpenGL, сделал несколько учебников и не могу понять, что я делаю неправильно здесь. Часть, за которой я застреваю, фактически отображает изображение на дисплее, поскольку оно отображается только как белый квадрат. Я прошел через другие вопросы переполнения стека для этого, но ни один из предложений не сработал для меня.Изображение полного экрана OpenGL
Я делаю это в Visual Studio 2015, используя приложение win32 и установил пакет NupenGL. Для целей тестирования я использую растровое изображение 256x256 и загружаю его через библиотеку SOIL, которую я создал и статически связал.
Первоначально я думал, что не создавал/связывал библиотеку SOIL, поэтому что-то фанки продолжалось, пытаясь загрузить изображение. Я создал пользовательский загрузчик BMP, который не работал, и я также попробовал другие пользователи BMP-загрузчики при переполнении стека безрезультатно. Теперь я считаю, что это не загрузка текстуры, а то, что я что-то испортил, когда на самом деле пытаюсь ее отобразить. Также в моем коде ниже я выводю, если текстура недействительна, но она всегда возвращается хорошо.
Мой код:
#include <gl/freeglut.h>
#include <stdio.h>
#include <iostream>
#include "SOIL.h"
void init();
void display(void);
void keyPressed(unsigned char key, int x, int y);
void resize(int heightY, int widthX);
// define the window position on screen
int window_x;
int window_y;
// variables representing the window size
int window_width = 480;
int window_height = 480;
// variable representing the window title
char *window_title = "Resolution Enhancement via Display Vibrations";
bool fullscreen = false;
//-------------------------------------------------------------------------
// Program Main method.
//-------------------------------------------------------------------------
void main(int argc, char **argv)
{
// Connect to the windowing system + create a window
// with the specified dimensions and position
// + set the display mode + specify the window title.
glutInit(&argc, argv);
glutInitWindowSize(window_width, window_height);
glutInitWindowPosition(window_x, window_y);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutCreateWindow(window_title);
glutFullScreen();
// Setup keyPressed
glutKeyboardFunc(keyPressed);
// Handler for when the screen resizes
glutReshapeFunc(resize);
// Set OpenGL program initial state.
init();
// Set the callback functions
glutDisplayFunc(display);
// Start GLUT event processing loop
glutMainLoop();
}
//-------------------------------------------------------------------------
// Set OpenGL program initial state.
//-------------------------------------------------------------------------
void init()
{
// Set the frame buffer clear color to black.
glClearColor(0.0, 0.0, 0.0, 0.0);
}
//-------------------------------------------------------------------------
// This function is passed to glutDisplayFunc in order to display
// OpenGL contents on the window.
//-------------------------------------------------------------------------
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -5.0f);
GLuint texture = SOIL_load_OGL_texture // load an image file directly as a new OpenGL texture
(
"C:/Users/joeja/Desktop/Grass.bmp",
SOIL_LOAD_AUTO,
SOIL_CREATE_NEW_ID,
SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT
);
if (texture == 0) {
std::cout << "Texture not found!\n" << std::endl;
}
else
{
std::cout << "Texture is good\n" << std::endl;
}
glBindTexture(GL_TEXTURE_2D, texture);
glBegin(GL_QUADS); // front face
glTexCoord2f(0.0f, 0.0f); glVertex3f(0.5f, -0.5f, 0.5f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(0.5f, 0.5f, 0.5f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-0.5f, 0.5f, 0.5f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.5f, -0.5f, 0.5f);
glEnd();
glutSwapBuffers();
}
void resize(int heightY,int widthX) {
const float ar = (float)widthX/(float)heightY;
glViewport(0, 20, widthX, heightY);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-ar + 1, ar - 1, -1.0, 1.0, 2.0, 90.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void keyPressed(unsigned char key, int x, int y) {
switch (key) {
case 27:
case 70:
case 102: /* Fullscreen mode (Additional) : f/F */
fullscreen = !fullscreen;
if (fullscreen)
{
glutFullScreen(); /* Go to full screen */
}
else
{
glutReshapeWindow(800, 600); /* Restore us */
glutPositionWindow(0, 0);
}
break;
}
}
'-ar + 1, ar - 1' выглядит неправильно для меня. Когда widthX и heightY равны, тогда ar == 1, и оба значения равны 0. Если это не просто '-ar, ar'? И почему вы используете 20 для y-значения glViewport (который, кроме того, не соблюдается в соотношении сторон? – BDL
Whoa! Вы загружаете изображение из файла * каждый кадр *. – doug65536
Используйте 'SOIL_FLAG_MIPMAPS' или установите' GL_TEXTURE_MIN_FILTER' для вариант non-'MIPMAP'. – genpfault