2013-11-16 3 views
0

Я пытаюсь создать простой трассировщик луча, и я нахожу отображение текстуры в квадрат для визуализации. Разрешение, с которым я начал работать, - 250X250, но когда я его изменяю, скажем, 300X300, он компилируется и вылетает.Почему этот ящик пикселя не позволяет мне изменить размер окна/количество пикселей?

#include <stdlib.h> 
#include <GL/glut.h> 

using namespace std; 

const int window_w = 250; 
const int window_h = 250; 

struct RGBType 
{ 
    float r; 
    float g; 
    float b; 
}; 

GLuint tex = 0; 

void init() 
{ 
    RGBType pixels[ window_w*window_h ]; 

    RGBType* temp = pixels; 
    for (int x = 0; x < window_w*window_h; x++) 
    { 
      temp->r = 0; 
      temp->g = 0; 
      temp->b = 1; 
      temp++; 
    } 

    glGenTextures(1, &tex); 
    glBindTexture(GL_TEXTURE_2D, tex); 
    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, GL_RGB, window_w, window_h, 0, GL_RGB, GL_FLOAT, NULL); 
    glTexSubImage2D(GL_TEXTURE_2D,0,0,0,window_w,window_h,GL_RGB,GL_FLOAT,pixels); 
} 

void display(void) 
{ 
    glClearColor(0, 0, 0, 1); 
    glClear(GL_COLOR_BUFFER_BIT); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 

    glOrtho(0, 1, 0, 1, -1, 1); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glColor3ub(255, 255, 255); 
    glEnable(GL_TEXTURE_2D); 
    glBindTexture(GL_TEXTURE_2D, tex); 

    glBegin(GL_QUADS); 
    glTexCoord2i(0, 0); 
    glVertex2i(0, 0); 
    glTexCoord2i(1, 0); 
    glVertex2i(1, 0); 
    glTexCoord2i(1, 1); 
    glVertex2i(1, 1); 
    glTexCoord2i(0, 1); 
    glVertex2i(0, 1); 
    glEnd(); 

    glutSwapBuffers(); 
} 

int main(int argc, char** argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); 
    glutInitWindowSize(window_w,window_h); 
    glutCreateWindow("Ray Tracer"); 
    init(); 
    glutDisplayFunc(display); 
    glutMainLoop(); 
    return 0; 
} 

ответ

1

Возможно, вы просто закончили стеки. Вы выделяете массив большого размера статически, что может легко поглотить весь стек, назначенный вашему процессу. Используйте динамическое распределение. Вы используете C++, так и newdelete[] операторов:

RGBType *pixels = new RGBType[ window_w*window_h ]; 

for(int x = 0; x < window_w*window_h; x++) 
{ 
     pixels[x].r = 0; 
     pixels[x].g = 0; 
     pixels[x].b = 1; 
} 

glGenTextures(1, &tex); 
glBindTexture(GL_TEXTURE_2D, tex); 
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, GL_RGB, window_w, window_h, 0, GL_RGB, GL_FLOAT, pixels); 

delete[] pixels; 
+0

Я также интересен, как я мог бы использовать двойники вместо поплавков, потому что, когда я изменить типы и GL_DOUBLE, экран становится белым. – whoadrian

+0

@AdrianCristea: 'GL_DOUBLE' не является принятым типом передачи пикселей. То есть ваш экран становится белым, потому что вызов 'glTexImage2D (...)' завершается с 'GL_INVALID_ENUM'. Вы должны проверить 'glGetError (...)' в какой-то момент. –