新手第一问,大家来帮忙啊,哈哈哈!!Q:
我用OpenGL做一个贴图的demo,画了一个球,用一张台球的图片贴在上面,到这全部OK,运行结果正常
但是,我后来加了个旋转功能,就发现只有球在动,贴图始终保持在那个位置上没有跟球体一起运动
请问这个问题是什么原因,何解?部分代码如下:
Init()
{
...
glEnable(GL_TEXTURE_2D);
//指定像素的存储对齐方式,保持与BMP格式一致
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
glGenTextures(1, &texName);//创建纹理
glBindTexture(GL_TEXTURE_2D, texName);-----get the bmp data-----------//指定图片作为纹理,注意bmp像素为BGR序
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
BMP.bmWidth, BMP.bmHeight,
0,  GL_BGR_EXT, GL_UNSIGNED_BYTE, BMP.bmBits);
DeleteObject(hBMP); // Delete The ObjectglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_LINEAR);//纹理函数,决定颜色如何组合
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE,  GL_SPHERE_MAP);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE,  GL_SPHERE_MAP);
...
}display()
{
...glRotatef()...glutSolidSphere()...glFlush()...
}

解决方案 »

  1.   

    回调函数啊.
    int main(int argc, char* argv[])
    {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH);
    glutInitWindowSize(800, 600);
    glutInitWindowPosition(100, 100);
    glutCreateWindow("纹理贴图");
    init();
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutMainLoop();
    return 0;
    }
      

  2.   

    你列出的代码部分没问题的,应该是你贴图的代码部分的问题,纹理坐标的计算的问题
    glTexCoord3f( ... );
    glVertex3f( ...);这两个函数里面的坐标也要是随着变化的
      

  3.   

    可我画的是球呀,坐标是自动生成的,没法一个点一个点的设glTexCoord3f吧
      

  4.   

    可能是我理解出了问题吧,我知道一般都是用
    glTexCoord2f() glVertex3f() 成对出现的方法来指定纹理和模型的顶点坐标对应关系但是我这里用的是glutSolidSpere方法画的球体
    用了一个叫glTexGenf的函数来生成纹理坐标,没有手动指定
      

  5.   

    glTexGenf
    是映射上去的,意味着不管球怎么转,纹理都是不动的,想要纹理随球运动,好像是只有逐三角画,逐三角贴图