2012-01-23 88 views
0

我需要能夠拉伸我在整個2d或3d(面)形狀中導入的圖像紋理。它只會渲染在形狀的右上角,並且重複 - 如果啓用GL_REPEAT,或者如果啓用GL_CLAMP,圖像將從投影到邊緣的邊突出。OpenGL紋理貼圖座標

這裏是我的代碼:

#include "stdafx.h" 
#include "glut.h" 
#include <stdio.h> 
#include <windows.h> 
#include <stdlib.h> 



GLuint texture; 
float xRotation = 0.0f; 




void drawScene1 (void) { 
    //glRotatef(xRotation,0.0f,1.0f,0.0f); 
    glBindTexture(GL_TEXTURE_2D, texture); 
    //glutSolidCube(1.0f); 

    glBegin(GL_POLYGON); 
     glTexCoord2d(0,1); 
     glVertex2d(-1.5,-1.5); 

     glTexCoord2d(1,1); 
     glVertex2d(1.0,-2.0); 

     glTexCoord2d(1,0); 
     glVertex2d(+1.5,+1.5); 

     glTexCoord2d(0,0); 
     glVertex2d(-1.5,+1.5); 
    glEnd(); 
} 




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



GLuint LoadTexture(const char * filename, int width, int height) { 

    GLuint texture; 
    unsigned char * data; 
    FILE * 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); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data); 

    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 

    //glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
    //glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); 
    //glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); 
    gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, width, height, GL_RGB, GL_UNSIGNED_BYTE, data); 


    free(data); 
    return texture; 
} 




void init (void) { 
    glShadeModel(GL_SMOOTH); 
    glMatrixMode(GL_PROJECTION); 
    //glLoadIdentity(); 
    //gluOrtho2D(0,500,0,500); 
    //glClearDepth(1); 
    //glEnable (GL_DEPTH_TEST); 
    //glEnable (GL_LIGHTING); 
    //glEnable (GL_LIGHT0); 
    //glEnable(GL_COLOR_MATERIAL); 
    glEnable(GL_NORMALIZE); 
    glEnable(GL_TEXTURE_2D); 
    glEnable(GL_TEXTURE_GEN_S); 
    glEnable(GL_TEXTURE_GEN_T); 

} 




void display (void) { 
    glClearColor(0.05,0.05,0.1,1.0); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); 
    texture = LoadTexture("img.raw", 256, 256); 

    drawScene1(); 

    FreeTexture(texture); 
    glutSwapBuffers(); 
    xRotation++; 
} 



int main (int argc, char **argv) { 
    glutInit(&argc,argv); 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH); 
    glutInitWindowSize(500,500); 
    glutInitWindowPosition(100,100); 
    glutCreateWindow("Virgin"); 
    init(); 
    glutDisplayFunc(display); 
    glutIdleFunc(display); 
    glutMainLoop(); 
    return 0; 
} 

回答

5

請決定:隱式紋理座標生成:

glEnable(GL_TEXTURE_GEN_S); 
glEnable(GL_TEXTURE_GEN_T); 

或顯式紋理座標懇求:

glTexCoord(...) 

隱式將覆蓋明確。


void display (void) { 
/*... */ 
    texture = LoadTexture("img.raw", 256, 256); 

    drawScene1(); 

    FreeTexture(texture); 
/* ... */ 
} 

不要加載並刪除紋理每個渲染幀。在啓動時加載紋理,並僅在渲染時綁定它們。

+0

非常感謝你,希望我被教過! –

3

刪除以下行:

glEnable(GL_TEXTURE_GEN_S); 
glEnable(GL_TEXTURE_GEN_T); 

你已經有紋理座標通過glTexCoord2f進入(),無需生成它們。