OPenGL生成圆柱文件

//#include<windows.h>
#include<glut.h>
#include<GL/GLU.h>
#include<GL/GL.h>
#include<math.h>
#include <afxwin.h>
//#include <atlimage.h>
int n=1000;
GLuint textureId;

bool createTexture(char *path)
{
	HBITMAP hBitmap = (HBITMAP)LoadImage(NULL, path, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
	if (hBitmap == NULL)
		return false;

// 	CBitmap bitmap;
// 	if(!bitmap.Attach(hBitmap))
// 		return false;

 	BITMAP bmInfo;
	GetObject(hBitmap, sizeof(BITMAP), &bmInfo);
// 	bitmap.GetBitmap(&bmInfo);
	

	int nCount = bmInfo.bmWidthBytes * bmInfo.bmHeight;
	unsigned char *pData = new unsigned char[nCount];
	GetBitmapBits(hBitmap, nCount, pData);
//	bitmap.GetBitmapBits(nCount, pData);


	//vertical flip 
	unsigned char *temp = new unsigned char [bmInfo.bmWidthBytes];
	int start = 0, target = nCount - bmInfo.bmWidthBytes;
	for (int i = 0; i < (bmInfo.bmHeight >> 1); ++i)
	{
		memcpy(temp, &pData[start], bmInfo.bmWidthBytes);
		memcpy(&pData[start], &pData[target], bmInfo.bmWidthBytes);
		memcpy(&pData[target], temp, bmInfo.bmWidthBytes);

		start += bmInfo.bmWidthBytes;
		target -= bmInfo.bmWidthBytes;
	}	
	delete []temp;

	int nComponents = bmInfo.bmBitsPixel / 8;
	glGenTextures(1, &textureId);
	glBindTexture(GL_TEXTURE_2D, textureId);

	// set pixel alignment  format
	glPixelStorei (GL_UNPACK_ALIGNMENT, 4); 

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

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

	//glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
	glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE/*GL_MODULATE*/);

	GLenum format = GL_BGR_EXT;
	if (nComponents == 4)
		format = GL_BGRA_EXT;
	gluBuild2DMipmaps(GL_TEXTURE_2D, nComponents, bmInfo.bmWidth, bmInfo.bmHeight, format, GL_UNSIGNED_BYTE, pData);

	delete []pData;
	return true;
}


void  display()  {

	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	gluLookAt(1, 1, -2, 0, 0, 0, 0, 1, 0);


	double delta =0.36;
	GLfloat r=1.0f;
	GLfloat h=2.2f;
  	double theta = delta;
	int i=1;
	glColor3f( 1.0, 1.0, 0.5);     // Set current color to green

	

	



	glColor3f( 0.5, 0.5, 1.0);

	theta = 0.0;
	glBegin(GL_TRIANGLE_FAN);
	glVertex3f(0, 0, 0);
	glVertex3f(r, 0, 0);
	for (i = 1; i < n; ++i)
	{
		float x = r * cos(theta);
		float y = r * sin(theta);
		glVertex3f(x, y, 0);
		theta += delta;
	}
	glVertex3f(r, 0, 0);
	glEnd();


	glColor3f( 0.0, 1.0, 1.0);

	theta = 0.0;
	glBegin(GL_TRIANGLE_FAN);
	glVertex3f(0, 0, h);
	glVertex3f(r, 0, h);
	for (i = 0; i < n; ++i)
	{
		float x = r * cos(theta);
		float y = r * sin(theta);
		glVertex3f(x, y, h);
		theta += delta;
	}
	glVertex3f(r, 0, h);
	glEnd();


	

	theta = 0.0;
	glBegin (GL_QUAD_STRIP);	   
		float tt=0;
		for (i = 0;i< 19; i++)
		{
			float x = r * cos(theta);
			float y = r * sin(theta);
			glTexCoord2f (tt, 1.0f);
			glVertex3f(x, y, h);
			glTexCoord2f ( tt,0.0f);
			glVertex3f(x, y, 0);
			theta += delta;
			tt+=0.05;		
		}
	 
	glEnd ();
	glDisable (GL_TEXTURE_2D); /* disable texture mapping */



	
	glutSwapBuffers();
  	glFlush();   // Force to display the new drawings immediately 
} 

void init()
{
	glClearColor(1.0f, 1.0f, 1.0f, 0.0f);

	//depth test
	glEnable(GL_DEPTH_TEST);
	glDepthFunc(GL_LEQUAL);
	glClearDepth(1.0);


	glEnable(GL_TEXTURE_2D);
	createTexture("3.bmp");

	

	//lighting
	

	GLfloat light_ambient[] = {0.2, 0.2, 0.2, 1.0};
	GLfloat light_diffuse[] = {1.0, 1.0, 1.0, 1.0};
	GLfloat light_specular[] = {1.0, 1.0, 1.0, 1.0};
	GLfloat light_position[] = {1.0, 1.0, 1.0, 1.0};    //点光源
	//对第0个光源进行设置
	glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
	glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
	glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
	glLightfv(GL_LIGHT0, GL_POSITION, light_position);

	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT0);
   

	//物体自身材质属性的设置
	GLfloat mat_ambient[] = {0.7, 0.7, 0.7, 1.0};
	GLfloat mat_diffuse[] = {0.1, 0.5, 0.8, 1.0};
	GLfloat mat_specular[] = {1.0, 1.0, 1.0, 1.0};
	GLfloat no_mat[] = {0.0, 0.0, 0.0, 1.0};
	GLfloat shininess = 50.0f;

	glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
	glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
	glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
	glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);
	glMaterialf(GL_FRONT, GL_SHININESS, shininess);



	glEnable (GL_NORMALIZE);
	glNormal3f(0,0,1);
	glNormal3f(0,0,-1);
	float v[]={1,1,0};
	glNormal3fv(v);
	 glShadeModel(GL_SMOOTH);
}

void reshape(int width, int height)
{


	glViewport(0, 0, width, height);

	//change to projection mode
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();

	//keep the same aspect
	if (width > height)
	{
		double ratio = (double)width / height;
		glOrtho(-2 * ratio, 2 * ratio, -2, 2, 1, 10);
	}
	else
	{
		double ratio = (double)height / width;
		glOrtho(-2, 2, -2 * ratio, 2 * ratio, 1, 10);
	}

	//change to model view mode
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}




int  main( int  argc,  char  **argv)  {





	//char *path="c:\test.bmp";







  	glutInit( &argc, argv);          // Initialize GLUT function callings
	glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
	glutInitDisplayMode(GLUT_RGBA | GLUT_SINGLE);
	
     // Set window size (width, height) in number of pixels  
	glutInitWindowSize( 600, 800);   
	// Set window position, from the left and top of the screen,
  	glutInitWindowPosition( 200, 300);        // in numbers of pixels 
	// Specify a window creation event 
  	glutCreateWindow( "Cylinder"); 
       	 
	// Specify the drawing function that is called when the window 
 	glutDisplayFunc(display);         // is created or re-drew
	glutReshapeFunc(reshape);
 	init();		      // Invoke this function for initialization	 
	glutMainLoop();           // Enter the event processing loop 
  	return 0;                     // Indicate normal termination 
				      // (Required by ANSI C)
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值