opengl 蝴蝶飞

2023-11-23 14:30
文章标签 opengl 蝴蝶

本文主要是介绍opengl 蝴蝶飞,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本人一直在学习opengl, 技术仍然有很大的发展空间  以下程序是蕴酿很长时间才写出来的,可能在有些高手大牛面前时小case  但是我用了大约一个星期做出来 这些博客记录了我一步步学习opengl的过程 希望有些代码能给其他新手一些idea。本程序读取图片用了freeimage库,这样可以读很多不同种的格式图片,真的很好用,所以大家在运行一下程序的时候要配置一下属性。另外我在蝴蝶后面加了一些花的纹理,可能看上去并不美观,如果你觉得不好看,可以将“贴一束花”那段代码删除,这样看上去比较好看。

以下程序:

#include<GL/glut.h>
#include "FreeImage.h"#include <Windows.h>
float angle;const int a=5;const int number=50;struct JSnow 
{float x,y;int b;
};
JSnow Snow[number];
char* bmpfile[a]={("Data/2.jpg"),("Data/3.jpg"),("Data/5.jpg"),("Data/6.jpg"),("Data/hua.jpg")};
int w=500,h=500;
GLuint texture[a];
GLenum image_format = GL_BGR_EXT;        //format the image is in
GLint internal_format = GL_RGB;        //format to store the image in
GLint level = 0;                   //mipmapping level
GLint border = 0;
FREE_IMAGE_FORMAT fif = FIF_UNKNOWN;
FIBITMAP *dib(0);
//BYTE* bits(0);
unsigned char *imageData;
unsigned int width(0), height(0);bool LoadImage(const char*filename)
{//unsigned int texID;unsigned int index1;unsigned char temp;
#ifdef FREEIMAGE_LIBFreeImage_Initalise();
#endifFIBITMAP *dib(0);fif = FreeImage_GetFileType(filename, 0);if(fif == FIF_UNKNOWN) fif = FreeImage_GetFIFFromFilename(filename);if(fif == FIF_UNKNOWN)return false;if(FreeImage_FIFSupportsReading(fif))dib = FreeImage_Load(fif, filename);if(!dib)return false;//bool flipResult = FreeImage_FlipVertical(dib);dib = FreeImage_ConvertTo24Bits(dib);imageData = (unsigned char *)FreeImage_GetBits(dib);//获取图像位信息;/*bits = FreeImage_GetBits(dib);*/width = FreeImage_GetWidth(dib);height = FreeImage_GetHeight(dib);int p=FreeImage_GetBPP(dib);if((imageData == 0) || (width == 0) || (height == 0))return false;//for(index1=0;index1<width*height*3;index1+=3)//BGR -> RGB 转换 //{//temp = imageData[index1];//imageData[index1] = imageData[index1+2];//imageData[index1+2] = temp;//}
}
void reshape(int  width,int  height)//调整和初始化GL的窗口
{if (height==0)										// Prevent A Divide By Zero By{height=1;										// Making Height Equal One}glViewport(0,0,width,height);						// Reset The Current ViewportglMatrixMode(GL_PROJECTION);						// Select The Projection MatrixglLoadIdentity();									// Reset The Projection Matrix// Calculate The Aspect Ratio Of The Window//gluPerspective(120.0f,(GLfloat)width/(GLfloat)height,1.0f,300.0f);glOrtho(0,w,0,h,-10.1,100);glMatrixMode(GL_MODELVIEW);							// Select The Modelview MatrixglLoadIdentity();									// Reset The Modelview Matrix//	gluLookAt(0.0,0.0,40.0,0.0,0.0,0.0,0.0,1.0,0.0);w=width;h=height;
}
int Init(void)
{glClearColor(1.0,1.0,1.0,1.0);glShadeModel(GL_SMOOTH);
//   glEnable(GL_DEPTH_TEST);for (int j=0;j<a;j++){LoadImage(bmpfile[j]);glGenTextures(1,&texture[j]);glBindTexture(GL_TEXTURE_2D,texture[j]);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);glTexImage2D(GL_TEXTURE_2D, level, internal_format, width, height,border, image_format, GL_UNSIGNED_BYTE, imageData);}return true;
}
void InitSnow()
{for (int i=0;i<number;i++){Snow[i].b=rand()%4;Snow[i].x=rand()%w-10;Snow[i].y=rand()%h-10;}
}void display()
{glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);	// Clear The Screen And The Depth BufferglEnable(GL_TEXTURE_2D);glColor3f(1.0,1.0,1.0);glMatrixMode( GL_MODELVIEW );
//接下来贴背景纹理 一束花glLoadIdentity();// Reset The ViewglBindTexture(GL_TEXTURE_2D,texture[4]);glBegin(GL_QUADS);glNormal3f( 0.0f, 1.0f, 0.0f);glTexCoord2f(0.0f, 0.0f);glVertex3f(0,0,0); //glVertex3f(-w/2.0,-h/2.0, 0.0f);glTexCoord2f(1.0f, 0.0f); glVertex3f(w,0,0); //glVertex3f(w/2.0,-h/2.0, 0.0f);glTexCoord2f(1.0f, 1.0f); glVertex3f(w,h,0); //glVertex3f( w/2, h/2, 0.0f);glTexCoord2f(0.0f, 1.0f);glVertex3f(0,h,0); //glVertex3f(-w/2, h/2, 0.0f);glEnd();glEnable(GL_DEPTH_TEST);//glMatrixMode(GL_MODELVIEW);//glColor3f(1.0,0.0,0.0);glPushMatrix();//glEnable(GL_BLEND); //glEnable(GL_ALPHA_TEST); //glAlphaFunc(GL_GREATER ,0.0);//0.5可以换成任安在0~1之间的数for (int i=0;i<number;i++){glPushMatrix();glTranslated(Snow[i].x,Snow[i].y,0.0);glRotated(angle,0.0,0.0,1.0);		glBindTexture(GL_TEXTURE_2D, texture[Snow[i].b]);glBegin(GL_QUADS);glTexCoord2f(0.0f, 0.0f);glVertex3f(-w/50.0f,-h/50.0f, -1.0f);glTexCoord2f(1.0f, 0.0f); glVertex3f( w/50.0f,-h/50.0f, -1.0f);glTexCoord2f(1.0f, 1.0f);glVertex3f( w/50.0f, h/50.0f, -1.0f);glTexCoord2f(0.0f, 1.0f);glVertex3f(-w/50.0f, h/50.0f, -1.0f);glEnd();glPopMatrix();//angle+=0.05;//glRasterPos2f(Snow[i].x,Snow[i].y);}glutSwapBuffers();//glFlush();glDisable(GL_TEXTURE_2D);glDisable(GL_DEPTH_TEST);
}void idle()
{InitSnow();display();angle+=0.05f;Sleep(300);
}int main(int argc,char **argv)
{glutInit(&argc,argv);glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);glutInitWindowSize(500,500);glutCreateWindow(argv[0]);Init();InitSnow();glutReshapeFunc(reshape);glutDisplayFunc(display);glutIdleFunc(idle);glutMainLoop();return 0;
}


如果背景为空,运行程序如下:

如果加上背景:


这篇关于opengl 蝴蝶飞的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/418577

相关文章

OpenGL-ES 学习(6)---- 立方体绘制

目录 立方体绘制基本原理立方体的顶点坐标和绘制顺序立方体颜色和着色器实现效果和参考代码 立方体绘制基本原理 一个立方体是由8个顶点组成,共6个面,所以绘制立方体本质上就是绘制这6个面共12个三角形 顶点的坐标体系如下图所示,三维坐标的中心原点位于立方体的中心,但是要特别注意的是,前后方向表示的是Z轴,上下方向表示的是Y轴 立方体的顶点坐标和绘制顺序 立方体坐标定义

OpenGL:中点直线算法

理论部分 中点直线算法是通过在像素中确定与理想直线最靠近的像素来进行扫描转换的。 在上图中,假设直线的斜率 0 ≤ m ≤ 1 0\le m \le 1 0≤m≤1。假设当前最近的像素已经确认为 P ( x k , y k ) P(x_k, y_k) P(xk​,yk​),由于 x x x位最大的位移方向,因此直线在 x x x方向上每次增加一个像素单位,而在 y y y方向上是否

OpenGL学习笔记(二十九)

目录 模板测试 模板测试 当片段着色器处理完一个片段之后,模板测试(Stencil Test)会开始执行,和深度测试一样,它也可能会丢弃片段。接下来,被保留的片段会进入深度测试,它可能会丢弃更多的片段。模板测试是根据又一个缓冲来进行的,它叫做模板缓冲(Stencil Buffer)。

OpenGL学习笔记(二十八)

目录 面剔除 面剔除 一个3D立方体,从任何一个方向去看它,最多可以同时看到的面是3个。可以从一个立方体的任意位置和方向上去看它,但是永远不能看到多于3个面。所以为何还要去绘制那三个不会显示出来的3个面呢。如果可以以某种方式丢弃它们,会提高片段着色器超过50%的性能,这就是面剔除要做的事情。

OpenGL学习笔记(二十七)

目录 混合 混合 在OpenGL中,物体透明技术通常被叫做混合(Blending)。透明是物体(或物体的一部分)非纯色而是混合色,这种颜色来自于不同浓度的自身颜色和它后面的物体颜色。一个有色玻璃窗就是一种透明物体,玻璃有自身的颜色,但是最终的颜色包含了所有玻璃后面的颜色。这也正是混合这名称的出处,因为我们将多种(来自于不同物体)颜色混合为一个颜色,透明使得我们可以看穿物体。

OpenGL学习笔记(二十六)

目录 模板测试 模板测试 当片段着色器处理完片段之后,模板测试(Stencil Test) 就开始执行了,和深度测试一样,它能丢弃一些片段。仍然保留下来的片段进入深度测试阶段,深度测试可能丢弃更多。模板测试基于另一个缓冲,这个缓冲叫做模板缓冲(Stencil Buffer),我们被允许在渲染时更新它来获取有意思的效果。 模板缓冲中的模板值(Stencil Value)通常是

OpenGL学习笔记(二十五)

目录 EarlyZ EarlyZ 现在大多数 GPU 都支持一种称为提前深度测试(Early depth testing)的硬件功能。 提前深度测试允许深度测试在片段着色器之前运行。明确一个片段永远不会可见的 (它是其它物体的后面) 。 片段着色器通常是相当费时的所以应该尽量避免运行。 对片段着色器提前深度测试一个限制是,你不应该写入片段的深度值。如果片段着色器将写入其

OpenGL学习笔记(二十三)

目录 颜色 颜色 现实世界中有无数种颜色,每一个物体都有它们自己的颜色。我们要做的工作是使用(有限的)数字来模拟真实世界中(无限)的颜色,因此并不是所有的现实世界中的颜色都可以用数字来表示。然而我们依然可以用数字来代表许多种颜色,并且你甚至可能根本感觉不到他们与真实颜色之间的差异。颜色可以数字化的由红色(Red)、绿色(Green)和蓝色(Blue)三个分量组成,它们通常被缩

OpenGL学习笔记(二十二)

目录 光照 光照 现实世界的光照是极其复杂的,而且会受到诸多因素的影响,这是以目前我们所拥有的处理能力无法模拟的。因此OpenGL的光照仅仅使用了简化的模型并基于对现实的估计来进行模拟,这样处理起来会更容易一些,而且看起来也差不多一样。这些光照模型都是基于我们对光的物理特性的理解。其中一个模型被称为冯氏光照模型(Phong Lighting Model)。冯氏光照模型的主要结

OpenGL学习笔记(二十一)

目录 材质 材质 在真实世界里,每个物体会对光产生不同的反应。钢看起来比陶瓷花瓶更闪闪发光,一个木头箱子不会像钢箱子一样对光产生很强的反射。每个物体对镜面高光也有不同的反应。有些物体不会散射(Scatter)很多光却会反射(Reflect)很多光,结果看起来就有一个较小的高光点(Highlight),有些物体散射了很多,它们就会产生一个半径更大的高光。如果我们想要在OpenG