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顶点数组, glDrawArrays,glDrawElements

顶点数组, glDrawArrays,glDrawElements  前两天接触OpenGL ES的时候发现里面没有了熟悉的glBegin(), glEnd(),glVertex3f()函数,取而代之的是glDrawArrays()。有问题问google,终于找到答案:因为OpenGL ES是针对嵌入式设备这些对性能要求比较高的平台,因此把很多影响性能的函数都去掉了,上述的几个函数都被移除了。接

OpenGL ES学习总结:基础知识简介

什么是OpenGL ES? OpenGL ES (为OpenGL for Embedded System的缩写) 为适用于嵌入式系统的一个免费二维和三维图形库。 为桌面版本OpenGL 的一个子集。 OpenGL ES管道(Pipeline) OpenGL ES 1.x 的工序是固定的,称为Fix-Function Pipeline,可以想象一个带有很多控制开关的机器,尽管加工

OpenGL雾(fog)

使用fog步骤: 1. enable. glEnable(GL_FOG); // 使用雾气 2. 设置雾气颜色。glFogfv(GL_FOG_COLOR, fogColor); 3. 设置雾气的模式. glFogi(GL_FOG_MODE, GL_EXP); // 还可以选择GL_EXP2或GL_LINEAR 4. 设置雾的密度. glFogf(GL_FOG_DENSITY, 0

opengl纹理操作

我们在前一课中,学习了简单的像素操作,这意味着我们可以使用各种各样的BMP文件来丰富程序的显示效果,于是我们的OpenGL图形程序也不再像以前总是只显示几个多边形那样单调了。——但是这还不够。虽然我们可以将像素数据按照矩形进行缩小和放大,但是还不足以满足我们的要求。例如要将一幅世界地图绘制到一个球体表面,只使用glPixelZoom这样的函数来进行缩放显然是不够的。OpenGL纹理映射功能支持将

OpenGL ES 2.0渲染管线

http://codingnow.cn/opengles/1504.html Opengl es 2.0实现了可编程的图形管线,比起1.x的固定管线要复杂和灵活很多,由两部分规范组成:Opengl es 2.0 API规范和Opengl es着色语言规范。下图是Opengl es 2.0渲染管线,阴影部分是opengl es 2.0的可编程阶段。   1. 顶点着色器(Vert

OpenGL/GLUT实践:流体模拟——数值解法求解Navier-Stokes方程模拟二维流体(电子科技大学信软图形与动画Ⅱ实验)

源码见GitHub:A-UESTCer-s-Code 文章目录 1 实现效果2 实现过程2.1 流体模拟实现2.1.1 网格结构2.1.2 数据结构2.1.3 程序结构1) 更新速度场2) 更新密度值 2.1.4 实现效果 2.2 颜色设置2.2.1 颜色绘制2.2.2 颜色交互2.2.3 实现效果 2.3 障碍设置2.3.1 障碍定义2.3.2 障碍边界条件判定2.3.3 障碍实现2.3.

OpenGL——着色器画一个点

一、 绘制 在窗口中间画一个像素点: #include <GL/glew.h>#include <GLFW/glfw3.h>#include <iostream>using namespace std;#define numVAOs 1GLuint renderingProgram;GLuint vao[numVAOs];GLuintcreateShaderProgram (){c

试用GLFW并创建OpenGL和DX的环境

介绍GLFW GLFW官网:https://www.glfw.org/ GLFW is an Open Source, multi-platform library for OpenGL, OpenGL ES and Vulkan development on the desktop. It provides a simple API for creating windows, contex

鸿蒙(API 12 Beta6版)图形加速【OpenGL ES平台内插模式】超帧功能开发

超帧内插模式是利用相邻两个真实渲染帧进行超帧计算生成中间的预测帧,即利用第N-1帧和第N帧真实渲染帧预测第N-0.5帧预测帧,如下图所示。由于中间预测帧的像素点通常能在前后两帧中找到对应位置,因此内插模式的预测帧效果较外插模式更优。由于第N帧真实渲染帧需要等待第N-0.5帧预测帧生成并送显后才能最终送显,因此会新增1~2帧的响应时延。 OpenGL ES平台 业务流程 基于OpenGL

OpenGL DMA接口

Opengl的DMA版本接口主要作用是解决以前访问opengl对象, 必须先将对象绑定到当前状态机下才能访问的问题,这会导致驱动层需要去频繁的进行对象的引用查找。  比如以前非DMA版本的接口操作顶点数据  glGenBuffers(1, &vbo);glBindBuffer(GL_ARRAY_BUFFER, vbo);glBufferData(GL_ARRAY_BUFFER, sizeof