中易网

openGL如何给一个球体纹理贴图,并且当求转动的时候,纹理要随着球一起转动,要c++的详细代码,重谢!

答案:1  悬赏:60  
解决时间 2021-02-12 14:28
openGL如何给一个球体纹理贴图,并且当求转动的时候,纹理要随着球一起转动,要c++的详细代码,重谢!
最佳答案


#include 
#include 
#include 

#define stripeImageWidth 32
GLubyte stripeImage[4*stripeImageWidth];

#ifdef GL_VERSION_1_1
static GLuint texName;
#endif

void makeStripeImage(void)
{
   int j;
    
   for (j = 0; j < stripeImageWidth; j++) {
      stripeImage[4*j] = (GLubyte) ((j<=4) ? 255 : 0);
      stripeImage[4*j+1] = (GLubyte) ((j>4) ? 255 : 0);
      stripeImage[4*j+2] = (GLubyte) 0;
      stripeImage[4*j+3] = (GLubyte) 255;
   }
}


static GLfloat xequalzero[] = {1.0, 0.0, 0.0, 0.0};
static GLfloat slanted[] = {1.0, 1.0, 1.0, 0.0};
static GLfloat *currentCoeff;
static GLenum currentPlane;
static GLint currentGenMode;
static float roangles;

void init(void)
{
   glClearColor (0.0, 0.0, 0.0, 0.0);
   glEnable(GL_DEPTH_TEST);
   glShadeModel(GL_SMOOTH);

   makeStripeImage();
   glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

#ifdef GL_VERSION_1_1
   glGenTextures(1, &texName);
   glBindTexture(GL_TEXTURE_1D, texName);
#endif
   glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT);
   glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
   glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
#ifdef GL_VERSION_1_1
   glTexImage1D(GL_TEXTURE_1D, 0, GL_RGBA, stripeImageWidth, 0,
                GL_RGBA, GL_UNSIGNED_BYTE, stripeImage);
#else
   glTexImage1D(GL_TEXTURE_1D, 0, 4, stripeImageWidth, 0,
                GL_RGBA, GL_UNSIGNED_BYTE, stripeImage);
#endif

   glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
   currentCoeff = xequalzero;
   currentGenMode = GL_OBJECT_LINEAR;
   currentPlane = GL_OBJECT_PLANE;
   glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, currentGenMode);
   glTexGenfv(GL_S, currentPlane, currentCoeff);

   glEnable(GL_TEXTURE_GEN_S);
   glEnable(GL_TEXTURE_1D);
   //glEnable(GL_CULL_FACE);
   glEnable(GL_LIGHTING);
   glEnable(GL_LIGHT0);
   glEnable(GL_AUTO_NORMAL);
   glEnable(GL_NORMALIZE);
   glFrontFace(GL_CW);
   //glCullFace(GL_BACK);
   glMaterialf (GL_FRONT, GL_SHININESS, 64.0);
   roangles = 45.0f;
}

void display(void)
{
   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

   glPushMatrix ();
   glRotatef(roangles, 0.0, 0.0, 1.0);
#ifdef GL_VERSION_1_1
   glBindTexture(GL_TEXTURE_1D, texName);
#endif
   //glutSolidTeapot(2.0);
   glutSolidSphere( 2.0, 32, 32 );
   glPopMatrix ();
   glFlush();
}

void reshape(int w, int h)
{
   glViewport(0, 0, (GLsizei) w, (GLsizei) h);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   if (w <= h)
      glOrtho (-3.5, 3.5, -3.5*(GLfloat)h/(GLfloat)w, 
               3.5*(GLfloat)h/(GLfloat)w, -3.5, 3.5);
   else
      glOrtho (-3.5*(GLfloat)w/(GLfloat)h, 
               3.5*(GLfloat)w/(GLfloat)h, -3.5, 3.5, -3.5, 3.5);
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
}

void idle()
{
roangles += 0.1f;
glutPostRedisplay();
}
int main(int argc, char** argv)
{
   glutInit(&argc, argv);
   glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
   glutInitWindowSize(256, 256);
   glutInitWindowPosition(100, 100);
   glutCreateWindow (argv[0]);
   glutIdleFunc( idle );
   init ();
   glutDisplayFunc(display);
   glutReshapeFunc(reshape);

   glutMainLoop();
   return 0;
}这是OpenGL红宝书的例子,稍作改动,以显示球体转动时纹理是跟着动地。还有原来例子画的是Teapot.。。。


追问:
大神,这个怎么办?诉求解答

追答:你贴图显示的问题解决了吗?
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
php代码在浏览器中显示与右键 查看源文件有何
能不能把 无良神医的全本发给我 谢谢了 weixn
ios7的闹钟怎样调节5分钟之后在响
南娜面膜是否含激素调节
cisco PIX 722 防火墙 ;为什么内部主机无法p
车祸可以获得合作医疗的赔偿么?
北京现代全新胜达保养周期是多长
农村新民居建好后开发商交房时要提供什么手续
崇川沙南诊所地址在什么地方,想过去办事
〖交流〗请教智力Mm要怎么加点
各位能不能给我一个office tab 注册码
什么是学生品德形成的基础
请回答一下福特蒙迪欧致胜和老马自达6买什么
十字路口发生交通事故,我方直行,对方左转弯
伍家坪地址在哪,我要去那里办事
推荐资讯
CAJ里面文章的目录怎么出来?本来有目录的,
美利华新型建材公司地址有知道的么?有点事想
利河希望小学在哪里啊,我有事要去这个地方
告诉我你到底爱着谁
大连有名气的景观设计公司有哪些
信亨精品二手车地址在什么地方,想过去办事
请问杭州2016年2月初适合穿什么衣服
晨晨灯饰地址在什么地方,想过去办事
金盛不锈钢制品地址有知道的么?有点事想过去
苗方清颜专业祛痘滨江潮人汇店这个地址在什么
离婚诉讼案件,夫妻感情不和,怎么举证?什么
通泰汽车租赁我想知道这个在什么地方
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?