在opengl中加入�光照的效果,可用键盘控制放大缩小

w键放大 s键缩小 d键开关灯

预览效果例如以下:

源代码例如以下:

#include <gl/glut.h>
#include <gl/glaux.h>
#include <stdio.h>
#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "glut32.lib")
#pragma comment(lib, "glu32.lib")
#pragma comment(lib, "glut.lib")
#pragma comment(lib, "glaux.lib")UINT g_bmp[1];//贴图编号GLfloat LightAmbient[] = { 0.5f, 0.5f, 0.5f, 1.0f }; //环境光參数,半亮白色
GLfloat LightDiffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f }; //漫射光參数,
GLfloat LightPosition[] = { 0.0f, 0.0f, 0.0f, 1.0f }; //光源位置void Box(float x, float y, float z) //长方体
{glPushMatrix();glScalef(x, y, z);glEnable(GL_TEXTURE_2D); //贴图有效glBegin(GL_QUADS);glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);// 前glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, -1.0f, 1.0f);glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 1.0f, 1.0f);glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);// 后glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f, 1.0f, -1.0f);glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, -1.0f, -1.0f);glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);// 上glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f);glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, 1.0f, 1.0f);glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 1.0f, -1.0f);glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);// 下glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f, -1.0f, -1.0f);glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, -1.0f, 1.0f);glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);glTexCoord2f(1.0f, 0.0f); glVertex3f(1.0f, -1.0f, -1.0f);// 左glTexCoord2f(1.0f, 1.0f); glVertex3f(1.0f, 1.0f, -1.0f);glTexCoord2f(0.0f, 1.0f); glVertex3f(1.0f, 1.0f, 1.0f);glTexCoord2f(0.0f, 0.0f); glVertex3f(1.0f, -1.0f, 1.0f);glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);// 右glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);glEnd();glDisable(GL_TEXTURE_2D);//取消贴图glPopMatrix();
}
bool LoadTexture(char *filename, GLuint &texture)
{AUX_RGBImageRec *pImage = auxDIBImageLoadA(filename); //装入位图if (pImage == NULL) return false;glGenTextures(1, &texture); //生成贴图glBindTexture(GL_TEXTURE_2D, g_bmp[0]); //贴图生效gluBuild2DMipmaps(GL_TEXTURE_2D, 4, pImage->sizeX, pImage->sizeY, GL_RGB, GL_UNSIGNED_BYTE, pImage->data); //贴图数据return true;
}
void init()
{LoadTexture("i:\\4.bmp", g_bmp[0]);glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient); //设置环境光glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse); //设置漫射光glLightfv(GL_LIGHT1, GL_POSITION, LightPosition); //设置光源位置glEnable(GL_LIGHT1); //启用一号光源glEnable(GL_LIGHTING); //开光
}float s = 1, r = 0; //放大缩小的倍数和旋转參数
void renderScene(void)
{glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    // Clear The Screen And The Depth BufferglLoadIdentity();                                   // Reset The ViewglTranslatef(0.0f, 0.0f, -5);glRotatef(r, 1.0f, 1.0f, 0.0f);glScalef(s, s, s);Box(1, 1, 1);r += 0.01;//旋转glutSwapBuffers();
}
void changeSize(int w, int h)
{if (h == 0) h = 1;float ratio = 1.0* w / h;glMatrixMode(GL_PROJECTION);// 单位化投影矩阵。glLoadIdentity();glViewport(0, 0, w, h);// 设置视口大小为整个窗体大小gluPerspective(45, ratio, 1, 1000);// 设置正确的投影矩阵glMatrixMode(GL_MODELVIEW);//以下是设置模型视图矩阵glLoadIdentity();gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, -1.0, 0.0f, 1.0f, 0.0f);//设置观測点
}
int light = 1, bp = 0;
void keyfunc(unsigned char ch, int x, int y)
{if (ch == 'w') //发大缩小s += 0.1;else if (ch == 's')s -= 0.1;if (ch == 'd')//d键开关灯{if (light){light = 0;glDisable(GL_LIGHTING);printf("off\n");}else{light = 1;glEnable(GL_LIGHTING);printf("on\n");}}
}
int main(int argc, char * argv[])
{glutInit(&argc, argv);glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);glutInitWindowPosition(100, 100);glutInitWindowSize(320, 320);glutCreateWindow("Hello OpenGL");init();glutDisplayFunc(renderScene);glutIdleFunc(renderScene); //指定程序空暇时调用函数glutReshapeFunc(changeSize); //指定窗体形状变化时的回调函数glEnable(GL_DEPTH_TEST);glutKeyboardFunc(keyfunc);//键盘回调函数glutMainLoop();return 0;
}

所用贴图例如以下:

OpenGL之路(八)加入�光照效果和键盘控制相关推荐

  1. NeHe OpenGL第二十八课:贝塞尔曲面

    NeHe OpenGL第二十八课:贝塞尔曲面 贝塞尔曲面: 这是一课关于数学运算的,没有别的内容了.来,有信心就看看它吧. 贝塞尔曲面 作者: David Nikdel ( ogapo@ithink. ...

  2. 六级考研单词之路-八

    title: 六级考研单词之路-八 date: 2020-11-25 12:34:56 tags: 六级考研单词之路 Day08 1.secret[n.秘密:adj.秘密的] eg: He alone ...

  3. OpenGL学习笔记(八):进一步理解VAO、VBO和SHADER,并使用VAO、VBO和SHADER绘制一个三角形

    原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7888 ...

  4. OpenGL(十八)——Qt OpenGL绘制一个3D世界

    OpenGL(十八)--Qt OpenGL绘制一个3D世界 一.说明 本篇介绍构建一个3D的世界. 二.简介 加载3D世界,并在其中漫游: 在这一课中,你将学会如何加载3D世界,并在3D世界中漫游. ...

  5. 【OpenGL学习笔记⑧】——键盘控制正方体+光源【冯氏光照模型 光照原理 环境光照+漫反射光照+镜面光照】

    ✅ 重点参考了 LearnOpenGL CN 的内容,但大部分知识内容,小编已作改写,以方便读者理解. 文章目录 零. 成果预览图 一. 光照原理与投光物的配置 1.1 光照原理 1.2 投光物 二. ...

  6. 现代OpenGL教程(六):鼠标和键盘(imgui+OpenGL3.3)

    前言:该系列教程主要参考自网站www.opengl-tutorial.org,基于开源GUI框架imgui v1.61实现,imgui自带的例子里面直接集成了glfw+gl3w环境,本系列教程将gl3 ...

  7. ROS探索总结(七)(八)(九)——smartcar源码上传 键盘控制 操作杆控制

    ROS探索总结(七)--smartcar源码上传 看到前面写的博客还是帮助了很多ROS的学习者,我感到非常荣幸.其实我也是一名ROS的新手,ROS的相关资料少,上手难度大,我现在也在摸索着学习,还希望 ...

  8. 查看gpio状态_基于Arduino开发,借助blinker平台,让NodeMCU实现8路继电器APP端状态监视和控制...

    基于Arduino开发,借助blinker物联网平台,让NodeMCU实现8路继电器APP端状态监视和控制 先上开发板功能图: 本文利用了NodeMCU上的D0-D3,D5-D9,总共 8个 GPIO ...

  9. openGL绘制带纹理地球,并实现鼠标键盘控制

    openGL系列文章目录 文章目录 openGL系列文章目录 前言 一.绘制球体 二.关键代码 球体类(Sphere) 主函数 顶点着色器 片元着色器 显示效果 源码下载 参考 前言 openGL绘制 ...

最新文章

  1. VS2017 Cordova Ionic2 移动开发-环境搭建
  2. Docker知识3:Docker的体系简介
  3. 什么是前端开发中的 mobile first 策略
  4. jsp标签 判断 余数_舟山铝箔纸不干胶标签制作-雷宝实业
  5. Html5 各属性详解
  6. 河北大学计算机专业调剂,【计算机考研调剂】河北大学2021级硕士研究生预调剂信息统计的通知...
  7. aws rds监控慢sql_使用AWS Database迁移服务进行AWS RDS SQL Server迁移
  8. JS实现联欢会抽奖滚动数字效果
  9. android开源torrent解析,bt分析之bt种子制作(1)
  10. 电脑快捷启动工具 Lily5.1
  11. 元宇宙这个筐,快被骗子撑破了
  12. 个人简历应聘优势怎么写? 个人优势让你的简历模板加分
  13. 简单聊一聊UseCompressedOops UseCompressedClassPointers这两个JVM参数
  14. oracle 碎片超过1000有啥危害,碎片化带来的坏处作文1000字
  15. 0117 - 深耕 iBooks 标注导入
  16. java pinyin4j_java实现中文汉字转拼音 Pinyin4j的基本用法
  17. 7-1 最大公约数和最小公倍数分数 15作者 张彤彧单位 浙江大学
  18. 一款好用的视频转换gif的小软件——抠抠视频秀
  19. 3dsmax怎么添加uv坐标_012:多层贴图UVWMAP(UV坐标)技术
  20. PDF、WORD文档在线添加水印源码

热门文章

  1. JavaScript在发送请求AJAX请求时,URL的域名地址是使用绝对地址还是相对地址?
  2. java 获取当前年_java中的反射(三) - kelexin
  3. npm 查看登陆账号_自定义npm 及问题整理
  4. layer code 200转码 写一个后台封装通用实体类
  5. dnfdpl服务器维护了,2019DNF心悦DPL赛事活动地址 强化器和时空石没了
  6. java订单重复提交_java表单重复提交常用解决办法
  7. 计算机骗局案例,骗局揭秘 | 卖你一台假电脑,再送你一个假鲁大师
  8. easyexcel 导出设置标题_GitHub - niaobulashi/easy-excel: excel实现导入导出配置型通用方法项目...
  9. eclipse 设置默认编码为Utf-8
  10. 批量查进程linux,linux 批量删除进程与查看进程详解