Opengl 以绿色色调显示的纹理

Opengl 以绿色色调显示的纹理,opengl,textures,Opengl,Textures,我正在学习如何在OpenGL中应用纹理。我有一个相当简单的立方体,我试图在上面应用纹理,使它看起来像一块木板。当我应用纹理时,它显示为绿色色调。我可以应用一些看起来很好的其他纹理,所以我不知道这个有什么问题。我从下载的jpg创建了纹理。当我在预览中查看bmp文件时,它看起来很好(我在Mac上)。我将附加原始位图的屏幕截图,以及它在OpenGL渲染时的外观 我正在使用的纹理加载代码可以找到: 问题在于bmp图像本身。正如我提到的,我通过Gimp转换jpg文件来创建它。不知何故,这种转换出了问题。

我正在学习如何在OpenGL中应用纹理。我有一个相当简单的立方体,我试图在上面应用纹理,使它看起来像一块木板。当我应用纹理时,它显示为绿色色调。我可以应用一些看起来很好的其他纹理,所以我不知道这个有什么问题。我从下载的jpg创建了纹理。当我在预览中查看bmp文件时,它看起来很好(我在Mac上)。我将附加原始位图的屏幕截图,以及它在OpenGL渲染时的外观

我正在使用的纹理加载代码可以找到:


问题在于bmp图像本身。正如我提到的,我通过Gimp转换jpg文件来创建它。不知何故,这种转换出了问题。当我从命令行运行'file wood.bmp'时,我的响应是'wood.bmp:data'。它应该显示'wood.bmp:PC bitmap,Windows 3.x格式,128 x 128 x 24“或类似的内容。我使用良好的ol'MS Paint进行了转换,问题消失了


我正试图找出如何在Gimp中执行此操作,但现在一切正常。感谢所有建议!

使用Gimp导出.bmp图像时,请确保选择“不写入颜色空间信息”“选项,在兼容性选项下拉列表下。使用opengl渲染时,以这种方式导出的bmp图像不会以绿色色调显示

如果发生这种情况,则问题很可能与照明或要将其指定给的对象的颜色有关。确保对象的颜色为白色。我们可以看到您的纹理加载代码吗?那个PNG是RGB(没有alpha),但也许你正在将它作为RGBA加载?当然。我编辑了我的OP,以包含一个指向git存储库的链接,其中包含了相同的代码。我倾向于同意@AlexBeisley的观点,即这可能是一个照明问题(假定glColor已经是白色的)或颜色掩蔽问题。我会尝试将一些位图值打印到控制台,以检查它们是否为绿色。此外,没有
glPixelStorei(GL\u UNPACK\u ALIGNMENT,1)
set,这在加载两个RGB纹理的非幂次时可能是一个问题。谢谢大家。我对这一点完全陌生,现在非常困惑。我从一个jpg文件开始,在Gimp中将其裁剪为128x128,然后将其导出为一个bmp文件。它怎么会变成绿色?如果这种方法不起作用,那么创建bmp文件的正确方法是什么,我可以将其读入OpenGL?
unsigned int texture[2];  //  Texture names

// define the board
float square_edge       =    1;
float border            =  0.5;
float board_thickness   = 0.25;
float board_corner      = 4 * square_edge + border;
float board_width       = 2 * board_corner;

GLfloat board_vertices[8][3] = {
    {-board_corner,  board_corner, 0.0},
    {-board_corner, -board_corner, 0.0},
    { board_corner, -board_corner, 0.0},
    { board_corner,  board_corner, 0.0},
    {-board_corner,  board_corner, -board_thickness},
    {-board_corner, -board_corner, -board_thickness},
    { board_corner, -board_corner, -board_thickness},
    { board_corner,  board_corner, -board_thickness}
};

void polygon(int a, int b, int c, int d) {
    glBindTexture(GL_TEXTURE_2D, texture[0]);
    glBegin(GL_QUADS);
    glTexCoord2f(0.0, 0.0);  glVertex3fv(board_vertices[a]);
    glTexCoord2f(1.0, 0.0);  glVertex3fv(board_vertices[b]);
    glTexCoord2f(1.0, 1.0);  glVertex3fv(board_vertices[c]);
    glTexCoord2f(0.0, 1.0);  glVertex3fv(board_vertices[d]);
    glEnd();
}

void draw_board() {

    glPushMatrix();

    glRotatef(rotx, 1.0, 0.0, 0.0);
    glScalef(1/board_corner, 1/board_corner, 1/board_corner);

    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_FLOAT, 0, board_vertices);

    glBindTexture(GL_TEXTURE_2D, texture[1]);

    glColor3f(1.0, 1.0, 1.0); //color of the border, sides, bottom of board

    // draw the board
    polygon(0,3,2,1);
    polygon(2,3,7,6);
    polygon(0,4,7,3);
    polygon(1,2,6,5);
    polygon(4,5,6,7);
    polygon(0,1,5,4);

    glPopMatrix();
}

void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_TEXTURE_2D);
    glLoadIdentity();

    double Ex = -2*dim*Sin(th)*Cos(ph);
    double Ey = +2*dim        *Sin(ph);
    double Ez = +2*dim*Cos(th)*Cos(ph);
    gluLookAt(Ex,Ey,Ez , 0,0,0 , 0,Cos(ph),0);

    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

    draw_board();

    glFlush();
    glutSwapBuffers();    
}