您的位置:首页 > 运维架构

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)
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息