代码下载


#include "CELLWinApp.hpp"
#include <gl/GLU.h>
#include <assert.h>
#include <math.h>
#pragma comment(lib,"opengl32.lib")
#pragma comment(lib,"glu32.lib")
#pragma comment(lib,"winmm.lib")

/**
* 这个例子展示如何做纹理动画
* glMatriModel();
* 主要使用glTranslatef();
* glScalef();
* glRoatef()函数
* 按下 't'建,做移动纹理
* 按下 's'键,缩放纹理
* 按下 'r'旋转文件
*/
/**
* 顶点结构声明,u,v作弊啊飘
*/
struct Vertex
{

float u,v;
/**
* 顶点坐标
*/
float x, y, z;
};

Vertex g_cubeVertices[] =
{
{ 0, 0, -1.0f,-1.0f, 1.0f },
{ 1, 0, 1.0f,-1.0f, 1.0f },
{ 1, 1, 1.0f, 1.0f, 1.0f },
{ 0, 1, -1.0f, 1.0f, 1.0f },
};

class Tutorial5 :public CELL::Graphy::CELLWinApp
{
public:
Tutorial5(HINSTANCE hInstance)
:CELL::Graphy::CELLWinApp(hInstance)
,_primitiveType(GL_POINTS)
,_flag('T')
{
}
virtual void render()
{
do
{
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);

static float fXrot = 0.0f;
/**
* 获取一帧绘制的时间
*/
static DWORD dwBegin = timeGetTime();

float fElpased = float(timeGetTime() - dwBegin) * 0.001f;
dwBegin = timeGetTime();
/**
* 指明,要操作的矩阵是模型矩阵
*/
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glTranslatef( 0.0f, 0.0f, -5.0f );

/**
* 指定操作纹理矩阵
*/
glMatrixMode(GL_TEXTURE);
/**
* 平移矩阵
*/
if (_flag == 'T')
{
glTranslatef(fElpased,0,0);
}
/**
* 缩放矩阵
*/
else if (_flag == 'S')
{
glScalef(fElpased + 1,fElpased + 1,fElpased + 1);
}
/**
* 旋转矩阵
*/
else if (_flag == 'R')
{
/**
* OpenGL中使用的是角度,将弧度转化为角度
*/
#define RAD2DEG 57.2957795130823208f
glRotatef(fElpased * RAD2DEG,0,0,1);
}

/**
* 使用纹理
*/
glBindTexture(GL_TEXTURE_2D,_textureId);
glInterleavedArrays( GL_T2F_V3F, 0, g_cubeVertices );
glDrawArrays( GL_QUADS, 0, 4 );

SwapBuffers( _hDC );
} while (false);
}

/**
* 生成投影矩阵
* 后面为了重用性,我们会写一个专门的matrix类,完成矩阵的一系列擦做
* 这个是很有必须要的,当你对Opengl了解的不断深入,你会发现,很多都是和数学有关的
*/
void perspective(float fovy,float aspect,float zNear,float zFar,float matrix[4][4])
{
assert(aspect != float(0));
assert(zFar != zNear);
#define PI 3.14159265358979323f

float rad = fovy * (PI / 180);

float halfFovy = tan(rad / float(2));
matrix[0][0] = float(1) / (aspect * halfFovy);
matrix[1][1] = float(1) / (halfFovy);
matrix[2][2] = -(zFar + zNear) / (zFar - zNear);
matrix[2][3] = -float(1);
matrix[3][2] = -(float(2) * zFar * zNear) / (zFar - zNear);
#undef PI
}
virtual void onInit()
{
/**
* 调用父类的函数。
*/
CELL::Graphy::CELLWinApp::onInit();
/**
* 设置Opengl的投影方式,改例子里面,我们使用正交投影
* OpenGL的投影方式有两种(我知道的):正交,和透视,有兴趣的可以google下
* 这里采用的窗口坐标系,与Windows窗口坐标一直,左上角为 0,0,右下角为 _winWidth,_winHeight
* 这种投影下绘制出来的物体没有三维感
*/
//glOrtho(0,_winWidth,_winHeight,0,1,-1);
//! 修改投影方式-透视投影,
//! 指定我们要进行操作的矩阵,OpenGL是一个状态机,所以要操作那一个状态的时候,需要进行切换
//! 下面的这句话就是切换到投影矩阵上
//! gluPerspective细节实现,参照下面的网址:http://www.opengl.org/sdk/docs/man2/xhtml/gluPerspective.xml

glMatrixMode( GL_PROJECTION );
#if 0

glLoadIdentity();
gluPerspective( 45.0, (GLdouble)_winWidth / (GLdouble)_winHeight, 0.1, 100.0);

float mat[4][4];
glGetFloatv(GL_PROJECTION_MATRIX,(float*)mat);

#else
//! 这里我们也可以自己按照Opengl的投影方式生成一个投影矩阵,
//! 然后将投影矩阵给OpenGL
GLfloat matrix[4][4] =
{
0,0,0,0,
0,0,0,0,
0,0,0,0,
0,0,0,0
};
perspective(45.0f, (GLfloat)_winWidth / (GLfloat)_winHeight, 0.1f, 100.0f,matrix);
glLoadMatrixf((float*)matrix);
#endif
glClearColor(0,0,0,1);

/**
* 增加如下两句话
* glEnable(GL_DEPTH_TEST); 启动深度测试,这样,有遮挡计算,被遮盖的将覆盖
* glEnable(GL_TEXTURE_2D); 启动纹理,支持纹理贴图,这样才可以绘制纹理出来
*/
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
/**
* 读一个bmp图片
*/
HBITMAP hBmp = (HBITMAP)LoadImageA(0,"1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
/**
* 获取图片的大小
*/
BITMAP bmpInf = {0};
GetObject(hBmp,sizeof(bmpInf),&bmpInf);
/**
* 获取图片的颜色数据(r,g,b)
*/
int size = bmpInf.bmHeight * bmpInf.bmWidth * 3;
char* data = new char[size];

BITMAPINFO bi;
bi.bmiHeader.biSize = sizeof(bi.bmiHeader);
bi.bmiHeader.biWidth = bmpInf.bmWidth;
bi.bmiHeader.biHeight = bmpInf.bmHeight;
bi.bmiHeader.biPlanes = 1;
bi.bmiHeader.biBitCount = 24;
bi.bmiHeader.biCompression = BI_RGB;
bi.bmiHeader.biSizeImage = size;
bi.bmiHeader.biClrUsed = 0;
bi.bmiHeader.biClrImportant = 0;

/**
* 获取rgb数据
*/
int idata = GetDIBits(_hDC,hBmp,0,bi.bmiHeader.biHeight,data,&bi,DIB_RGB_COLORS);

/**
* 产生一个纹理Id,可以认为是纹理句柄,后面的操作将书用这个纹理id
*/
glGenTextures( 1, &_textureId );

/**
* 使用这个纹理id,或者叫绑定(关联)
*/
glBindTexture( GL_TEXTURE_2D, _textureId );
/**
* 指定纹理的放大,缩小滤波,使用线性方式,即当图片放大的时候插值方式
*/
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
/**
* 将图片的rgb数据上传给opengl.
*/
glTexImage2D(
GL_TEXTURE_2D, //! 指定是二维图片
0, //! 指定为第一级别,纹理可以做mipmap,即lod,离近的就采用级别大的,远则使用较小的纹理
GL_RGB, //! 纹理的使用的存储格式
bmpInf.bmWidth, //! 宽度,老一点的显卡,不支持不规则的纹理,即宽度和高度不是2^n。
bmpInf.bmHeight, //! 宽度,老一点的显卡,不支持不规则的纹理,即宽度和高度不是2^n。
0, //! 是否的边
GL_BGR_EXT, //! 数据的格式,bmp中,windows,操作系统中存储的数据是bgr格式
GL_UNSIGNED_BYTE, //! 数据是8bit数据
data
);
delete []data;
/**
* 删除图片
*/
DeleteObject(hBmp);

}

virtual int events(unsigned msg, unsigned wParam, unsigned lParam)
{
switch(msg)
{
case WM_KEYDOWN:
{
if (wParam == 'S' ||wParam == 'S')
{
_primitiveType += 1;
if (_primitiveType >=GL_POLYGON )
{
_primitiveType = 0;
}
}
_flag = wParam;
}
break;
}
return __super::events(msg,wParam,lParam);
}
protected:
unsigned _primitiveType;
/**
* 保存纹理Id
*/
unsigned _textureId;
/**
* 标志,移动 = 't',旋转 = 'r' 缩放='s'
*/
unsigned _flag;
};

int CALLBACK _tWinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nShowCmd
)
{
(void*)hInstance;
(void*)hPrevInstance;
(void*)lpCmdLine;
(void*)nShowCmd;

Tutorial5 winApp(hInstance);
winApp.start(640,480);
return 0;
}

转载于:https://www.cnblogs.com/zhanglitong/p/3189718.html

OpenGL6-纹理动画相关推荐

  1. 火云开发课堂 - 《Shader从入门到精通》系列 第六节:在Shader中使用纹理动画

    <Shader从入门到精通>系列在线课程 第六节:在Shader中使用纹理动画 视频地址:http://edu.csdn.net/course/detail/1441/22670?auto ...

  2. Threejs纹理对象Texture阵列、偏移、旋转(纹理动画)

    纹理对象Texture阵列.偏移.旋转 本文是Three.js电子书的8.4节 8.1节给大家提到过纹理对象Texture,简单的说纹理对象Texture就是包含一张图片的对象,纹理对象Texture ...

  3. 关于ThreeJs纹理贴图动画的实现

    效果图:实际效果,图中的贴图是可以动的 一.准备工作 1.静态文件 2.首先你要引入相关依赖: threejs核心依赖: http://www.yanhuangxueyuan.com/versions ...

  4. Dx11---纹理与光照(火焰动画,纹理的旋转,贴不同的纹理)

    一.贴纹理 1.获取纹理 // 初始化旋转纹理HR(CreateDDSTextureFromFile(m_pd3dDevice.Get(), L"..\\Texture\\flareoutp ...

  5. Unity Shader 序列帧动画

    shader中的序列帧动画属于纹理动画中的一种,主要原理是将给定的纹理进行等分,再根据时间的变化循环播放等分中的一部分. Unity Shader 内置时间变量 名称 类型 描述 _Time floa ...

  6. 偏移shaderuv_Unity Shader 之 uv动画

    Unity 动画 Unity Shader 内置时间变量 引入时间变量 名称 类型 描述 _Time float4 t是自该场景加载开始所经过的时间,4个分量分别是(t/20, t, 2t, 3t) ...

  7. opengl es3.0学习篇八:纹理

    2019独角兽企业重金招聘Python工程师标准>>> 学习内容来源and参考 opengl es 3.0编程指南 https://www.jianshu.com/p/4d8d352 ...

  8. 《Real-Time Rendering 4th Edition》读书笔记--简单粗糙翻译 第六章 纹理 Texturing

    写在前面的话:因为英语不好,所以看得慢,所以还不如索性按自己的理解简单粗糙翻译一遍,就当是自己的读书笔记了.不对之处甚多,以后理解深刻了,英语好了再回来修改.相信花在本书上的时间和精力是值得的. -- ...

  9. Unity Shader学习记录(18) —— Shader动画

    纹理动画 纹理动画在游戏中的应用非常广泛.尤其在各种资源都比较局限的移动平台上,我们往往会使用纹理动画来代替复杂的粒子系统等模拟各种动画效果. 11.2.1序列帧动画 _Time是float4类型, ...

最新文章

  1. 【PP模块】订单分割(Order Split)
  2. Android应用启动后自动创建桌面快捷方式
  3. 计数排序、桶排序和基数排序
  4. linux 进程的执行时间,Linux 获取进程执行时间
  5. 自然语言处理模型_ICLR 2020 「自然语言处理」【Prosus AI】金融情感分析FinBERT模型(含源码)!...
  6. 资源放送丨《OGG日常运维及故障处理》PPT视频
  7. php dwg格式,dwg格式怎么打开 dwg格式打开的方法
  8. 【编解码】从零开始写H264解码器(1) 总纲
  9. 考研复试之路:不努力怎敢轻易言弃
  10. git拉取报错:You have not concluded your merge. (MERGE_HEAD exists)
  11. php 半角 全角空格,全角空格和半角空格
  12. 笔记本计算机卡,笔记本电脑越来越卡怎么办 不同原因解决方法不同
  13. 如何设置计算机硬盘密码,计算机设置硬盘加密方法以启动密码
  14. 基于uFUN开发板的心率计(二)动态阈值算法获取心率值
  15. 评论:“哭不起”的王君为何还流泪
  16. 手机浏览器能接收彩信,还hold住吗?
  17. Android初学之自定义简单蛛网(雷达)图
  18. 嵌入式设计与开发项目-DHT11温湿度传感器程序设计
  19. AE实现Label Feature(转)
  20. ubuntu更换阿里镜像源

热门文章

  1. LeetCode 2156. 查找给定哈希值的子串(字符串哈希)
  2. LeetCode 1298. 你能从盒子里获得的最大糖果数(BFS)
  3. LeetCode 848. 字母移位(前缀和+取模)
  4. LeetCode 371. 两整数之和(位运算加法)
  5. LeetCode 56. 合并区间(优先队列)
  6. 图Graph--最小生成树
  7. 平面设计中的网格系统pdf_平面设计基础知识
  8. qq登录界面句柄_别小看QQ邮箱测试,80%的测试新手都不能写出完整的测试用例~...
  9. 肝了1W字!文本生成评价指标的进化与推翻
  10. 使用Spring StateMachine框架实现状态机