纹理与不需要的颜色

时间:2012-11-29 11:58:49

标签: c opengl textures glut

我正在尝试学习如何在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

2 个答案:

答案 0 :(得分:4)

在将数据上传到纹理之前需要绑定纹理,因此在glTexImage2D之前使用glBindTexture。另外,由于它没有mipmap,因此纹理将不完整,缩小和放大滤镜的默认值需要它们。使用glTexParameter将过滤器设置为线性,或以其他方式创建mipmap。

答案 1 :(得分: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;
}