OpenGL加载纹理时颜色错误。

3

我正在尝试理解如何在OpenGL中加载纹理,并编写了这个非常简单的代码:

GLuint texture;

void loadTexture() {

    GLubyte data[] = {  255,0,0,
                        0,255,0,
                        0,255,0,
                        255,0,0    };

    glGenTextures(1, &texture);

    glBindTexture(GL_TEXTURE_2D, texture);          

    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);   
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);   

    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );

    int chk = gluBuild2DMipmaps( GL_TEXTURE_2D, GL_RGB, 2, 2, GL_RGB, GL_UNSIGNED_BYTE, data );

    if (chk!=0) 
        printf("error code = %d\n",chk);
    else 
        printf("success\n");  

}

我使用loadTexture()将纹理加载到内存中。在这个示例中,纹理非常简单,但目前并不重要。

void drawTexturedSquare() {

    glEnable( GL_TEXTURE_2D );
    glBegin (GL_QUADS);

    glTexCoord2f (0.0, 0.0);
    glNormal3f(0, 0, 1);
    glVertex3f (0.0, 0.0, 0.0);

    glTexCoord2f (1.0, 0.0);
    glNormal3f(0, 0, 1);
    glVertex3f (10.0, 0.0, 0.0);

    glTexCoord2f (1.0, 1.0);
    glNormal3f(0, 0, 1);
    glVertex3f (10, 10, 0.0);

    glTexCoord2f (0.0, 1.0);
    glNormal3f(0, 0, 1);
    glVertex3f (0.0, 10, 0.0);

    glEnd ();
    glDisable( GL_TEXTURE_2D);

}

我想将这个简单的纹理应用到一个正方形上。我从 draw() 函数中调用 drawTexturedSquare() 函数。
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

问题在于,我得到的结果是这样的: enter image description here 然而我期望正对角线(左上到右下)是绿色的,副对角线(右上到左下)是红色的。有人能解释一下为什么吗?
此外,每次运行程序都会得到不同的结果: enter image description here enter image description here enter image description here enter image description here 我不明白这个蓝色从哪里来...有人能帮助我吗?
2个回答

7

每行数据必须按照4字节对齐。要么在每行填充0 0,要么使用RGBA纹理。

如果您不想执行上述操作,可以使用:

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

你的颜色改变的原因是由于你没有正确填充行,OpenGL会读取数组末尾以外的内容。


谢谢,它起作用了!您能否解释一下为什么,如果我使用RGBA纹理,即使我放置0 alpha,代码也能正常工作?我本来期望能够“看到”一个透明的正方形... - Manlio
在渲染之前,您需要设置使用 alpha 通道的混合模式才能产生任何效果。 - rasmus

0

你可以尝试将GL_TEXTURE_MIN_FILTERGL_TEXTURE_MAG_FILTER设置为GL_NEAREST

目前,OpenGL正在插值颜色,创建渐变效果(因为你的纹理被从2x2拉伸到屏幕大小)

但这并不能解释为什么每次使用纹理时都会得到不同的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接