opengl 球纹理旋转源代码
专注java已6年,欢迎加入java核心技术QQ群:135138817,每周五晚有群主进行技术讲座。
#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <gl/glaux.h>
#include <stdio.h>
#include <io.h>
HWND hWnd;
HDC hDC;
HGLRC hRC=NULL; //定义渲染环境
HINSTANCE hInstance; //得到程序的例子
RECT rect;
int sw = 640;
int sh = 480;
bool fullscreen = 1;
GLfloat aspect;
GLfloat xrot; // X轴旋转 ( 新 )
GLfloat yrot; // Y轴旋转 ( 新 )
GLfloat zrot; // Z轴旋转 ( 新 )
GLuint texture[1]; //纹理的存储空间 ( 新 )
#pragma comment( lib, "opengl32.lib" ) // 链接时使用OpenGL32.lib
#pragma comment( lib, "glu32.lib" ) // 链接时使用GLu32.lib
#pragma comment( lib, "glaux.lib" ) // 链接时使用GLaux.lib
AUX_RGBImageRec *LoadBMP(char *Filename) // 读取位图图象
{
FILE *File=NULL; // 文件句柄
if (!Filename) // 确定文件名已给出
{
return NULL; // 如果文件名未给出则返回NULL
}
File=fopen(Filename,"r"); // 检测文件是否存在
if (File) // 文件是否存在?
{
fclose(File); // 关闭文件
return auxDIBImageLoad(Filename); // 读取位图并返回一个指针
}
return NULL; //如果调用文件失败则返回NULL
}
int LoadGLTextures() //调用Bitmap并转换成纹理
{
int Status=FALSE; //状态确定
AUX_RGBImageRec *TextureImage[1]; //为纹理创建存储空间
memset(TextureImage,0,sizeof(void *)*1); //将指针设为NULL
//读取位图,检查错误。如果位图不存在则退出
if (TextureImage[0]=LoadBMP("Data/TX.bmp"))
{
Status=TRUE; //设Status为TRUE
glGenTextures(1, &texture[0]); //创建纹理
//用位图中的数据进行典型的纹理生成
glBindTexture(GL_TEXTURE_2D, texture[0]);
glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
}
if (TextureImage[0]) //纹理是否存在
{
if (TextureImage[0]->data) //纹理图象是否存在
{
free(TextureImage[0]->data); //释放纹理图象所占用内存
}
free(TextureImage[0]); //释放图象结构
}
return Status; //返回Status的值
}
void SceneInit(int w, int h)
{
LoadGLTextures();
glEnable(GL_TEXTURE_2D);
glShadeModel(GL_SMOOTH); //允许平滑着色
glClearColor( 0.0, 0.0, 0.0, 0.5 );
glClearDepth(1.0f); //设置深度缓冲区
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL); //深度测试的类型
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}
void SceneResizeViewport(GLsizei w, GLsizei h)
{
if(h==0)
{
h=1;
}
aspect = (GLfloat)w/(GLfloat)h;
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION); //选择投影矩阵
glLoadIdentity();
gluPerspective( 45.0f, aspect, 0.1f, 100.0f );
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void SceneShow(GLvoid) //这里进行所有的绘图工作
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清屏和清除深度缓冲区
glLoadIdentity(); //重置当前Modelview矩阵
glTranslatef(0.0f,0.0f,-5.0f);
glRotatef(xrot,1.0f,0.0f,0.0f);
glRotatef(yrot,0.0f,1.0f,0.0f);
glRotatef(zrot,0.0f,0.0f,1.0f);
//glBindTexture(GL_TEXTURE_2D, texture[0]);
glBegin(GL_QUADS);
GLUquadricObj *quadObj = gluNewQuadric();//创建一个二次曲面物体
gluQuadricTexture(quadObj,GL_TRUE); //启用该二次曲面的纹理
glBindTexture(GL_TEXTURE_2D, texture[0]);//绑定纹理
gluSphere(quadObj,1,20,20); //画圆
gluDeleteQuadric(quadObj);
glEnd();
xrot+=0.3f;
yrot+=0.2f;
zrot+=0.4f;
}
void EnableOpenGL()
{
PIXELFORMATDESCRIPTOR pfd;
int iFormat;
hDC = GetDC( hWnd );
ZeroMemory( &pfd, sizeof( pfd ) );
pfd.nSize = sizeof( pfd );
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW |
PFD_SUPPORT_OPENGL |
PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 16;
pfd.cDepthBits = 16;
pfd.iLayerType = PFD_MAIN_PLANE;
iFormat = ChoosePixelFormat( hDC, &pfd );
SetPixelFormat( hDC, iFormat, &pfd );
hRC = wglCreateContext( hDC );
wglMakeCurrent( hDC, hRC );
}
// 取消 OpenGL
void DisableOpenGL()
{
wglMakeCurrent( NULL, NULL );
wglDeleteContext( hRC );
ReleaseDC( hWnd, hDC );
}
bool ChangeResolution(int w, int h, int bitdepth)
{
DEVMODE devMode;
int modeSwitch;
int closeMode = 0;
EnumDisplaySettings(NULL, closeMode, &devMode);
devMode.dmBitsPerPel = bitdepth;
devMode.dmPelsWidth = w;
devMode.dmPelsHeight = h;
devMode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
modeSwitch = ChangeDisplaySettings(&devMode, CDS_FULLSCREEN);
if(modeSwitch == DISP_CHANGE_SUCCESSFUL)
{
return true;
}
else
{
ChangeDisplaySettings(NULL, 0);
return false;
}
}
LRESULT CALLBACK WndProc( HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam )
{
switch ( message )
{
case WM_CREATE:
GetWindowRect(hWnd, &rect);
sw = rect.right - rect.left;
sh = rect.bottom - rect.top;
SceneResizeViewport(sw, sh);
return 0;
case WM_SIZE:
if(!fullscreen)
{
GetWindowRect(hWnd, &rect);
sw = rect.right - rect.left;
sh = rect.bottom - rect.top;
if(sw>0 && sh>0)
SceneResizeViewport(sw, sh);
}
else
{
SceneResizeViewport(GetSystemMetrics( SM_CXSCREEN ),
GetSystemMetrics( SM_CYSCREEN ));
}
return 0;
case WM_CLOSE:
ShowWindow (hWnd, SW_HIDE);
PostQuitMessage( 0 );
return 0;
case WM_DESTROY:
return 0;
case WM_KEYDOWN:
switch( wParam )
{
case VK_ESCAPE:
PostMessage(hWnd, WM_CLOSE, 0, 0);
break;
}
return 0;
default:
return DefWindowProc( hWnd,message, wParam, lParam );
}
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
WNDCLASS wc;
MSG msg;
bool bQuit = false;
if (MessageBox(NULL,"是否选择全屏显示模式?", "全屏方式运行?",MB_YESNO|MB_ICONQUESTION)==IDNO)
{
fullscreen=0; //窗口模式
}
wc.style = CS_OWNDC;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
wc.hbrBackground = (HBRUSH)GetStockObject( BLACK_BRUSH );
wc.lpszMenuName = NULL;
wc.lpszClassName = "Name";
RegisterClass( &wc );
if(fullscreen)
{
ChangeResolution(640, 480, 16);
hWnd = CreateWindow(
"Name",
"Lesson1",
WS_POPUP | WS_CLIPSIBLINGS | WS_VISIBLE,
0, 0,
GetSystemMetrics( SM_CXSCREEN ),
GetSystemMetrics( SM_CYSCREEN ),
NULL, NULL,
hInstance,
NULL );
}else
{
hWnd = CreateWindow(
"Name",
"Lesson1",
WS_TILEDWINDOW | WS_VISIBLE,
GetSystemMetrics( SM_CXSCREEN )/2-sw/2,
GetSystemMetrics( SM_CYSCREEN )/2-sh/2,
sw,
sh,
NULL, NULL,
hInstance,
NULL );
ChangeDisplaySettings(NULL, 0);
}
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
//Initialisation
EnableOpenGL();
SceneInit(sw, sh);
if(!fullscreen)
{
GetWindowRect(hWnd, &rect);
sw = rect.right - rect.left;
sh = rect.bottom - rect.top;
if(sw>0 && sh>0)
SceneResizeViewport(sw, sh);
}
else
{
SceneResizeViewport(GetSystemMetrics( SM_CXSCREEN ),
GetSystemMetrics( SM_CYSCREEN ));
}
while ( !bQuit )
{
if ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
if ( msg.message == WM_QUIT )
bQuit = true;
else
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
{
// OpenGL 动画
SceneShow();
SwapBuffers(hDC);
}
}
//关闭,退出程序
DisableOpenGL();
ShowWindow (hWnd, SW_HIDE);
DestroyWindow( hWnd );
ChangeDisplaySettings(NULL, 0);
return msg.wParam;
return 0;
}
转载于:https://www.cnblogs.com/myzhijie/articles/1658569.html
opengl 球纹理旋转源代码相关推荐
- android opengl旋转,OpenGL纹理旋转及翻转问题详解
大家好,我是程序员kenney,今天给大家讲解一下Android上OpenGL开发可能会遇到的一些纹理旋转及翻转的问题,其中有些原理在其它平台上如ios,osx上也是类似的.纹理旋转的问题一定要搞清楚 ...
- android 图片浏览器旋转,OpenGL纹理旋转及翻转问题详解
大家好,我是程序员kenney,今天给大家讲解一下Android上OpenGL开发可能会遇到的一些纹理旋转及翻转的问题,其中有些原理在其它平台上如ios,osx上也是类似的.纹理旋转的问题一定要搞清楚 ...
- OpenGL textures纹理的实例
OpenGL textures纹理 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <glad/glad.h> #include &l ...
- OpenGL渲染纹理和平面反射
OpenGL渲染纹理和平面反射 先上图,再解答. 完整主要的源代码 源代码剖析 先上图,再解答. 完整主要的源代码 #include <stdio.h> #include "GL ...
- C++ Opengl 绘制纹理字符源码
C++ Opengl 绘制纹理字符源码 项目开发环境 项目功能 项目演示 项目源码传送门 项目开发环境 开发语言:C++和IDE:VS2017,操作系统Windows版本windows SDK8.1, ...
- android数据球图,Android OpenGL球体贴图
OpenGL球体贴图的的整个流程就是计算出球体和纹理材质坐标,然后画出球体,按照纹理坐标将bitmap贴上去. 具体方法和上一篇文章画一个球体类似OpenGL绘制球体,只是需要创建材质,并且需要构建一 ...
- openCV读入图片,openGL实现纹理贴图
本文结合结合openCV,openGL的优点,实现混合编程. (1)OpenCV提供图形处理和计算机视觉方面的通用算法,读入二维图片很方便: (2)OpenGL是跨平台的图形程序接口,它用于二维,三维 ...
- OPenGL笔记--纹理滤波和光源
文章目录 一.前置知识 二.运行效果 三.完整代码 一.前置知识 光源 环境光:环境光来自四面八方:所有场景中的对象都处于环境光的照射中:如果没有环境光,未被漫射光照到的地方就会变得十分黑暗: 漫射光 ...
- OpenGL 5.纹理,混合,矩阵变化
混合 我们先画一个红色方块,再画一个蓝色方块,重叠的部分就是蓝色和红色按照某种方式混合,可以是蓝色完全覆盖红色,也可以是蓝色和红色叠加. 混合定义了如何将片段着色器输出颜色(也就是source)与目标 ...
最新文章
- 图片上加动图怎么弄_用PS把千张图片拼成心爱的人的样子,只需三步!
- CB Insights发布2017全球AI企业100强,出门问问、碳云智能入选
- python ftplib模块_python:ftplib模块
- 删除链表的倒数第n个节点 python_LeetCode 19.删除链表的倒数第N个节点(Python)
- SVD decomposition and polar decomposition
- 企业微信应用设置可信域名_怎么设置企业微信朋友圈功能?企业微信朋友圈功能有哪些限制?...
- 自动生成网络拓扑图开源_电信网络拓扑图自动布局之总线
- java 汉字排序_Java中文排序
- [并发并行]_[pthread]_[使用线程池并发复制文件]
- 运动模糊(Montion blur)
- 【编程之美】读书笔记:寻找最大的K个数
- 一键刷入twrp_努比亚Z17-Z17S-Z17mini 刷入MIUI10系统刷机教程
- VUE-table表格操作列表适配屏幕缩小固定右侧fixed
- handlebars.js_Handlebars.js入门指南
- Java学习导航汇总
- Python编写程序求解一元二次方程,打印九九乘法表,判断三条边是否可以构成三角形,并求三角形面积
- 【大学物理·光学】光的偏振状态
- 论文翻译—3D NDT算法论文(节选6.1-6.2)
- MATLAB离线模糊控制表生成以及模糊控制程序编写
- Windows7下注册表修改右键新建快捷键
热门文章
- 芯片的反向流程是怎么样的?
- js回调函数的理解(轉)
- Pessimistic Error Pruning example of C4.5
- bitbucket初次使用
- Ubuntu16.04(64位)下面使用Doxygen+Graphviz分析python代码
- matlab不显示变量,Matlab空间面板SAR模型运行时解释变量显示不全
- linux内核研究(一)
- 抽象工厂模式_抽象工厂模式
- python对csv文件中的数据进行分类_利用Python对csv文件中的数据进行排序
- php数组循环便利,浅析PHP中for与foreach两个循环结构遍历数组的区别