2012-11-29 45 views
1

我想学习如何在OpenGL中使用纹理。我没有安装freeimage,所以我不得不用for循环创建位图。
我想要做的就是简单地采取与质感都红点,并把它映射一个正方形内:纹理与不需要的颜色

#import <OpenGL/OpenGL.h> 
#import <GLUT/GLUT.h> 
#import <stdlib.h> 
#import <string.h> 
#import <math.h> 


GLuint texture; 
GLfloat (*pixels) [3]; 

void init() 
{ 

    // Inizializzazione 

    glEnable(GL_DEPTH_TEST); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(45, 1, 1, 1000); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    gluLookAt(0, 0, -100, 0, 0, 0, 0, 1, 0); 

    // Inizializzazione della texture 

    glGenTextures(1, &texture); 

    pixels= malloc(256*256*sizeof(GLfloat[3])); 

    for(GLuint i=0; i<256*256;i++) 
    { 
     pixels[i][0]=1.0; 
     pixels[i][1]= pixels[i][2]= 0.0; 
    } 

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 256, 256, 0, GL_RGB, GL_FLOAT, pixels); 

} 

void display() 
{ 
    glClearColor(0, 0, 0, 0); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glEnable(GL_TEXTURE_2D); 
    glBindTexture(GL_TEXTURE_2D, texture); 

    glPushMatrix(); 
    glBegin(GL_QUADS); 
    glVertex3f(0, 0, 0); 
    glTexCoord2f(0.0, 0.0); 
    glVertex3f(10, 0, 0); 
    glTexCoord2f(0.0, 1.0); 
    glVertex3f(10, 10, 0); 
    glTexCoord2f(1.0, 1.0); 
    glVertex3f(0, 10, 0); 
    glTexCoord2f(0.0, 1.0); 
    glEnd(); 
    glPopMatrix(); 

    glDisable(GL_TEXTURE_2D); 

    glutSwapBuffers(); 
} 


int main(int argc, char** argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE); 
    glutInitWindowPosition(100, 100); 
    glutInitWindowSize(600, 600); 
    glutCreateWindow(argv[0]); 
    glutDisplayFunc(display); 
    init(); 
    glutMainLoop(); 
    free(pixels); 
    return 0; 
} 

的问题是,所有的像素是红色的,但我得到一个白色方形而不是红色之一:

enter image description here

+0

您可以拨打免费(像素)已经glTexImage2D之后。你正在泄漏纹理:更好地调用glDeleteTextures(1,&纹理);在你的glutMainLoop()之后。 – Constantin

回答

1

这给一个镜头:

#include <GL/glut.h> 

GLuint texture; 
void init() 
{ 
    // Inizializzazione della texture 
    unsigned int i; 
    GLfloat* pixels = (GLfloat*)malloc(256 * 256 * sizeof(GLfloat) * 3); 
    for(i = 0; i < 256 * 256; i++) 
    { 
     GLuint base = i * 3; 
     pixels[ base + 0 ] = 1.0f; 
     pixels[ base + 1 ] = 0.0f; 
     pixels[ base + 2 ] = 0.0f; 
    } 

    glGenTextures(1, &texture); 
    glBindTexture(GL_TEXTURE_2D, texture); 

    // disable mipmap filtering since we aren't uploading mipmaps 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 256, 256, 0, GL_RGB, GL_FLOAT, pixels); 

    free(pixels); 
} 

void display(void) 
{ 
    glClearColor(0, 0, 0, 0); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(45, 1, 1, 1000); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    gluLookAt(0, 0, -100, 0, 0, 0, 0, 1, 0); 

    glEnable(GL_DEPTH_TEST); 

    glEnable(GL_TEXTURE_2D); 
    glBindTexture(GL_TEXTURE_2D, texture); 

    // important because GL_TEXTURE_ENV defaults to GL_MODULATE 
    glColor3ub(255,255,255); 

    glPushMatrix(); 
    glBegin(GL_QUADS); 
    glVertex3f(0, 0, 0); 
    glTexCoord2f(0.0, 0.0); 
    glVertex3f(10, 0, 0); 
    glTexCoord2f(0.0, 1.0); 
    glVertex3f(10, 10, 0); 
    glTexCoord2f(1.0, 1.0); 
    glVertex3f(0, 10, 0); 
    glTexCoord2f(0.0, 1.0); 
    glEnd(); 
    glPopMatrix(); 

    glDisable(GL_TEXTURE_2D); 

    glutSwapBuffers(); 
} 

int main(int argc, char** argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE); 
    glutInitWindowPosition(100, 100); 
    glutInitWindowSize(600, 600); 
    glutCreateWindow(argv[0]); 

    init(); 

    glutDisplayFunc(display); 
    glutMainLoop(); 
    return 0; 
} 
+0

很少需要代码,但是这让我明白如何去做。 –

4

您需要,然后再上传到它的数据,所以glTexImage2D之前使用glBindTexture纹理绑定。同样如此,纹理将不完整,因为它没有mipmap,而缩小和放大过滤器的默认值需要它们。使用glTexParameter将过滤器设置为线性,否则创建mipmap。