2016-05-06 4 views
2

Я пытаюсь создать приложение, которое все, что он делает, отображает полноэкранное изображение, а затем быстро прокручивает последовательность изображений (144hz). Я только начал смотреть на OpenGL, сделал несколько учебников и не могу понять, что я делаю неправильно здесь. Часть, за которой я застреваю, фактически отображает изображение на дисплее, поскольку оно отображается только как белый квадрат. Я прошел через другие вопросы переполнения стека для этого, но ни один из предложений не сработал для меня.Изображение полного экрана OpenGL

Я делаю это в Visual Studio 2015, используя приложение win32 и установил пакет NupenGL. Для целей тестирования я использую растровое изображение 256x256 и загружаю его через библиотеку SOIL, которую я создал и статически связал.

Первоначально я думал, что не создавал/связывал библиотеку SOIL, поэтому что-то фанки продолжалось, пытаясь загрузить изображение. Я создал пользовательский загрузчик BMP, который не работал, и я также попробовал другие пользователи BMP-загрузчики при переполнении стека безрезультатно. Теперь я считаю, что это не загрузка текстуры, а то, что я что-то испортил, когда на самом деле пытаюсь ее отобразить. Также в моем коде ниже я выводю, если текстура недействительна, но она всегда возвращается хорошо.

выход (полноэкранный режим): enter image description here

Выход (WINDOWED): enter image description here

Мой код:

#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; 
    } 
} 
+1

'-ar + 1, ar - 1' выглядит неправильно для меня. Когда widthX и heightY равны, тогда ar == 1, и оба значения равны 0. Если это не просто '-ar, ar'? И почему вы используете 20 для y-значения glViewport (который, кроме того, не соблюдается в соотношении сторон? – BDL

+1

Whoa! Вы загружаете изображение из файла * каждый кадр *. – doug65536

+0

Используйте 'SOIL_FLAG_MIPMAPS' или установите' GL_TEXTURE_MIN_FILTER' для вариант non-'MIPMAP'. – genpfault

ответ

1

Не загрузить изображение из файла для каждого кадра.

В вашей init вы должны:

  • загружает изображение с ПОЧВОЙ, как вы уже, хранить ID в texture

В display вы должны

  • glBindTexture(GL_TEXTURE_2D, texture);
  • glEnable(GL_TEXTURE_2D)
  • Жеребьевка материал
  • glDisable(GL_TEXTURE_2D);
  • glBindTexture(GL_TEXTURE_2D, 0);

Вы можете заметить, что вы можете пропустить некоторые включения/отключения, просто включив текстуру 2D и оставив ее включенной. Я дал псевдокод, который пытается всегда работать, пропуская избыточные изменения состояния - это оптимизация, не имеющая отношения к проблеме.

+0

'SOIL_load_OGL_texture' уже вызывает' glGenTextures' и 'glTexImage2D'. – BDL

+0

@BDL Хорошо, но его код обратный, он загружает его, а затем связывает другую текстуру. И загрузка из файла каждого 'дисплея' совершенно смехотворна. – doug65536

+1

@BDL ах Теперь я вижу вашу точку. SOIL загружает и все и возвращает сгенерированный идентификатор. Обновление ответа ... – doug65536

Смежные вопросы