//#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)
}
OPenGL生成圆柱文件
最新推荐文章于 2023-10-03 13:08:16 发布