OPenGL生成圆柱文件
2016-05-26 20:19
447 查看
//#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) }
相关文章推荐
- 解决Vista系统OpenGL驱动问题的方法整理
- Delphi下OpenGL2d绘图之画四边形的方法
- Delphi下OpenGL2d绘图之画点的方法
- Delphi下OpenGL2d绘图之初始化流程详解
- Delphi使用OpenGL2d绘图之画图片Bmp的方法
- 通过OpenGL ES混合模式缩放视频缓冲区来适应显示尺寸
- VC运用OPENGL加载BMP纹理图的实现方法汇总
- java实现OpenGL ES纹理映射的方法
- java基于OpenGL ES实现渲染实例
- OpenGL坐标系介绍
- 【翻译】安卓opengl ES教程之四——添加颜色
- linux下opengl的安装(with qt)
- OpenGL超级宝典笔记——显示列表
- OpenGL超级宝典笔记——顶点数组
- OpenGL生成轮廓
- OpenGL超级宝典笔记——性能比较
- OpenGL超级宝典笔记——顶点缓冲区对象
- OpenGL超级宝典笔记——选择
- OpenGL超级宝典笔记——反馈
- OpenGL超级宝典笔记——遮挡查询