2012-02-19 98 views
3

加载纹理时,我想了解如何在OpenGL中载入纹理和我写了这个非常简单的代码:颜色错误在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); 

} 

我想将这个简单的纹理应用于广场。我打电话功能drawTexturedSquare()draw()功能,我已经叫

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

的问题里面,这是结果我得到

enter image description here

,而我希望广场是绿色的主对角线(左上到右下),红色是次对角线(右上到左下)。有人可以解释我为什么?

再者,每次我运行程序时,我得到了不同的结果:

enter image description hereenter image description hereenter image description hereenter image description here

我不明白的地方这蓝色出来。5月有人能帮助我吗?

回答

7

数据的每一行都需要4字节对齐。或者用0填充每行,或者使用RGBA纹理。

如果你不想做上述情况,你可以使用:

glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 

你的颜色改变的原因是因为你不垫正确的行,OpenGL的读取过去的结束阵列。

+0

谢谢,它的工作!你能向我解释为什么,如果我使用RGBA纹理,即使我放置0 alpha,代码也能正常工作吗?我希望能够“看到”一个透明的正方形...... – Saphrosit 2012-02-19 13:00:59

+0

您需要设置一个混合模式,在对渲染有任何影响之前使用alpha通道。 – rasmus 2012-02-19 16:56:42

0

你可能想尝试GL_NEARESTGL_TEXTURE_MIN_FILTERGL_TEXTURE_MAG_FILTER

因为它是现在,OpenGL的是颜色之间进行插值,创造一个梯度(因为你的纹理被从2x2的拉伸至但是大屏幕是)

这并不能解释为什么你每次都会为你的纹理获得不同的结果。