2011-11-23 41 views
10

Tôi đang cố gắng đặt hình nền của cửa sổ OpenGL bằng cách tạo một hình tứ giác trên ma trận chiếu trực giao và thêm kết cấu vào đó. Tôi cũng đang sử dụng bộ công cụ GLUT trong ứng dụng của mình.Đặt hình nền của cửa sổ OpenGL

Tuy nhiên, tôi đang gặp một số sự cố. Dưới đây là ảnh chụp màn hình minh họa vấn đề: hình ảnh là màu xám và nó lặp lại trên x và y, mặc dù kích thước kết cấu được thiết lập giống như quad.

Đó là những gì tôi đang cố gắng để đạt được: Desired result

Và đó là những gì tôi nhận được: Actual result

Mã cho rendering và kết cấu tải trông như thế này:

void orthogonalStart (void) { 
    glMatrixMode(GL_PROJECTION); 
    glPushMatrix(); 
    glLoadIdentity(); 
    gluOrtho2D(0, w1, 0, h1); 
    glScalef(1, -1, 1); 
    glTranslatef(0, -h1, 0); 
    glMatrixMode(GL_MODELVIEW); 
} 

void orthogonalEnd (void) { 
    glMatrixMode(GL_PROJECTION); 
    glPopMatrix(); 
    glMatrixMode(GL_MODELVIEW); 
} 

GLuint LoadTexture(const char * filename, int width, int height) 
{ 
    GLuint texture; 
    unsigned char * data; 
    FILE * file; 

    //The following code will read in our RAW file 
    file = fopen(filename, "rb"); 
    if (file == NULL) return 0; 
    data = (unsigned char *)malloc(width * height * 3); 
    fread(data, width * height * 3, 1, file); 
    fclose(file); 

    glGenTextures(1, &texture); 
    glBindTexture(GL_TEXTURE_2D, texture); 
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 


    //even better quality, but this will do for now. 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR); 


    //to the edge of our shape. 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

    //Generate the texture 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0,GL_RGB, GL_UNSIGNED_BYTE, data); 
    free(data); //free the texture 
    return texture; //return whether it was successful 
} 

void FreeTexture(GLuint texture) 
{ 
    glDeleteTextures(1, &texture); 
} 

void background (void) { 
    glBindTexture(GL_TEXTURE_2D, texture); 

    orthogonalStart(); 

    glBegin(GL_QUADS); 
     glTexCoord2d(0.0,0.0); glVertex2f(0, 0); 
     glTexCoord2d(1.0,0.0); glVertex2f(1024, 0); 
     glTexCoord2d(1.0,1.0); glVertex2f(1024, 1024); 
     glTexCoord2d(0.0,1.0); glVertex2f(0, 1024); 
     glEnd(); 

    orthogonalEnd(); 
} 

void display (void) { 
    glClearColor (1.0,0.0,0.0,1.0); 
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); 
    glEnable(GL_TEXTURE_2D); 

    background(); 
    gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); 

    glutSwapBuffers(); 
} 

Để chuyển đổi kết cấu từ png sang định dạng Raw, tôi sử dụng photoshop, vì vậy tôi nghĩ hình ảnh màu xám có thể là do chuyển đổi.

Lưu ý: Tôi vừa bắt đầu học mở, vì vậy đây có thể không phải là cách tiếp cận tốt nhất. Xin vui lòng cho tôi biết nếu có một cách tốt hơn

Chỉnh sửa: Hình ảnh có để ở trên một nơi và không rescalse

+0

Side lưu ý: Tôi nghĩ bạn có nghĩa là glTexCoord2f ("d" là viết tắt của "kép", không "kích thước"). –

+0

@MarceloCantos Phải, nhưng nó không nên tạo nên sự khác biệt, phải không? – Vitalij

+0

Không, tôi không mong đợi điều này ảnh hưởng đến kết quả. –

Trả lời

12

tôi muốn avoid doing anything other than a glFrustum() or glOrtho() call cho ma trận chiếu của bạn.

Ngoài ra, thiết GL_UNPACK_ALIGNMENT-1 để tải kết cấu của bạn nếu bạn đang làm pixel 3 thành phần:

#include <GL/glut.h> 

int w1 = 0; 
int h1 = 0; 
void reshape(int w, int h) 
{ 
    w1 = w; 
    h1 = h; 
    glViewport(0, 0, w, h); 
} 


void orthogonalStart() 
{ 
    glMatrixMode(GL_PROJECTION); 
    glPushMatrix(); 
    glLoadIdentity(); 
    gluOrtho2D(-w1/2, w1/2, -h1/2, h1/2); 
    glMatrixMode(GL_MODELVIEW); 
} 

void orthogonalEnd() 
{ 
    glMatrixMode(GL_PROJECTION); 
    glPopMatrix(); 
    glMatrixMode(GL_MODELVIEW); 
} 


GLuint texture = 0; 
void background() 
{ 
    glBindTexture(GL_TEXTURE_2D, texture); 

    orthogonalStart(); 

    // texture width/height 
    const int iw = 500; 
    const int ih = 500; 

    glPushMatrix(); 
    glTranslatef(-iw/2, -ih/2, 0); 
    glBegin(GL_QUADS); 
     glTexCoord2i(0,0); glVertex2i(0, 0); 
     glTexCoord2i(1,0); glVertex2i(iw, 0); 
     glTexCoord2i(1,1); glVertex2i(iw, ih); 
     glTexCoord2i(0,1); glVertex2i(0, ih); 
    glEnd(); 
    glPopMatrix(); 

    orthogonalEnd(); 
} 


void display() 
{ 
    glClearColor (1.0,0.0,0.0,1.0); 
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); 
    glEnable(GL_TEXTURE_2D); 

    background(); 
    gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); 

    glutSwapBuffers(); 
} 


GLuint LoadTexture() 
{ 
    unsigned char data[] = { 255,0,0, 0,255,0, 0,0,255, 255,255,255 }; 

    glGenTextures(1, &texture); 
    glBindTexture(GL_TEXTURE_2D, texture); 
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 

    //even better quality, but this will do for now. 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_NEAREST); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_NEAREST); 

    //to the edge of our shape. 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

    //Generate the texture 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0,GL_RGB, GL_UNSIGNED_BYTE, data); 
    return texture; //return whether it was successful 
} 


int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE); 

    glutInitWindowSize(800,600); 
    glutCreateWindow("Aspect Ratio"); 

    glutDisplayFunc(display); 
    glutReshapeFunc(reshape); 
    texture = LoadTexture(); 
    glutMainLoop(); 
    return 0; 
} 
Các vấn đề liên quan