IOS Opengl ES 用多光源实现材质,阴影,高光效果

2023-11-05

在Opengl ES 1.0 中, 要实现材质效果,往往需要光源的设置, 如果环境光和漫反射光强了,材质效果难以体现, 如果环境光和漫反射光弱了,材质就暗了



实现阴影效果,可以放置一个主平行光源, 为了材质效果,需要将环境光设到比较弱,漫反射光设到稍强

    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    const GLfloat			lightAmbient[]  = {0.08, 0.08, 0.08, 1.0};
    const GLfloat			lightDiffuse[]  = {1.0, 1.0, 1.0, 1.0};
    const GLfloat			lightSpecular[]  = {1.0, 1.0, 1.0, 1.0};
    const GLfloat			lightPosition[] = {50, 100, 50, 0.0};

    glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmbient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDiffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, lightSpecular);
    glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);

将环境光调到很低, 增强漫反射光, 为体现材质,将镜面光调到最高



此时暗面非常暗, 需要往暗面打一个光

    glEnable(GL_LIGHT1);

    const GLfloat	    lightAmbient2[]  = {0.08, 0.08, 0.08, 1.0};
    const GLfloat           lightDiffuse2[] = {0.2, 0.2, 0.2, 1.0};
    const GLfloat	    lightSpecular2[]  = {0.1, 0.1, 0.1, 1.0};
    const GLfloat           lightPosition2[] = {-500, -1000, 500.0, 1.0};


    glLightfv(GL_LIGHT1, GL_AMBIENT, lightAmbient2);
    glLightfv(GL_LIGHT1, GL_DIFFUSE, lightDiffuse2);
    glLightfv(GL_LIGHT1, GL_SPECULAR, lightSpecular2);
    glLightfv(GL_LIGHT1, GL_POSITION, lightPosition2);

由于是暗面光,将漫反射光调低


此时发现物体亮度不够, 因此在主光源的同一位置再加两个光源

    glEnable(GL_LIGHT2);
    glEnable(GL_LIGHT3);

    const GLfloat           lightAmbient3[]  = {0.06, 0.06, 0.06, 1.0};
    const GLfloat           lightDiffuse3[] = {0.3, 0.3, 0.3, 1.0};
    const GLfloat	    lightSpecular3[]  = {1.0, 1.0, 1.0, 1.0};
    const GLfloat           lightPosition3[] = {20, 40, 20, 1.0};
    const GLfloat           lightPosition4[] = {50, 100, 50, 0.0};

    glEnable(GL_LIGHT2);
    glEnable(GL_LIGHT3);

    glLightfv(GL_LIGHT2, GL_AMBIENT, lightAmbient3);
    glLightfv(GL_LIGHT2, GL_DIFFUSE, lightDiffuse3);
    glLightfv(GL_LIGHT2, GL_SPECULAR, lightSpecular3);
    glLightfv(GL_LIGHT2, GL_POSITION, lightPosition3);
    
    glLightfv(GL_LIGHT3, GL_AMBIENT, lightAmbient3);
    glLightfv(GL_LIGHT3, GL_DIFFUSE, lightDiffuse3);
    glLightfv(GL_LIGHT3, GL_SPECULAR, lightSpecular3);
    glLightfv(GL_LIGHT3, GL_POSITION, lightPosition4);

将镜面光都调到最大, 更好的体现材质效果


最后加上材质

    const GLfloat	    matAmbient[]    = {0.4, 0.4, 0.4, 1.0};
    const GLfloat	    matDiffuse[]    = {0.6, 0.6, 0.6, 1.0};
    const GLfloat	    matSpecular[]   = {0.5, 0.5, 0.5, 1.0};
    const GLfloat           matEmission[]   = {0.0, 0.0, 0.0, 1.0};   

    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, matAmbient);
    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, matDiffuse);
    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, matSpecular);
    glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, matEmission);
    glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, lightShininess);



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IOS Opengl ES 用多光源实现材质,阴影,高光效果 的相关文章

  • 在完成块中保留循环

    在我的课堂上 我创建了这个方法 void refreshDatasourceWithSuccess CreateDataSourceSuccessBlock successBlock failure CreateDataSourceFail
  • iOS 自定义滑块删除两端的最小和最大空间

    我正在尝试使用自定义滑块 class MySlider UISlider override func trackRect forBounds bounds CGRect gt CGRect let customBounds CGRect o
  • TestFlight 提供反馈按钮

    我正在使用 iOS 8 的最新 testflight 版本 我将自己添加为内部测试人员 现在当我使用 testflight 打开应用程序时 我找不到反馈按钮 如果有人有任何线索 请告诉我 您在 Testflight 应用程序中提供反馈 打开
  • 使用 UItableviewCell 实现 Google 地图

    我正在尝试在 UItableviewCell 组件内实现谷歌地图 我这样做的方法是在原型单元中定义 GMSMapView 然后使用 dequeueReusableCell 方法配置地图单元 但是 我尝试应用的任何更改都会失败 例如添加标记
  • UILocalNotification 在后台 10 分钟后不提示

    In didFinishLaunchingWithOptions调用函数的定时器循环httpRequest每 1 分钟间隔一次 BOOL application UIApplication application didFinishLaun
  • mgwt - 以编程方式改变方向

    是否可以在 gwt mgwt 应用程序中更改强制执行特定的屏幕方向 可以说我希望用户始终以横向模式使用应用程序 这取决于 是作为phonegap应用程序 而不是在浏览器内部 如果您作为 Web 应用程序运行 则不需要t get any co
  • 如何在 Swift 中使用indexesOfObjectsPassingTest:

    IndexOfObjectsPassingTest 的声明在 Swift 中看起来像这样 func indexesOfObjectsPassingTest predicate AnyObject Int CMutablePointer
  • 如何正确创建迦太基 cartfile?

    我正在研究购物车文件 迫不及待地想 简单地创建一个购物车文件 就像所有说明所说的那样 只是 如何 简单地 创建一个 Cartfile 我创建了一个纯文本文档 将其命名为 cartfile 并在其中复制了一些依赖项 Ran carthage
  • .showsPhysics 内存泄漏

    我最近花了 5 个小时尝试调试 Spritekit 应用程序中的内存泄漏 应用程序启动后 我注意到内存使用量略有上升 我花了 5 个小时中的 3 个小时挖掘参考资料 了解强与弱的关系ARC https developer apple com
  • 如何从 ContentView 外部显示 SwiftUI 警报?

    我正在构建 Swift 应用程序 并试图找出如何显示警报 我有一个单独的 swift 文件正在执行一些计算 并且在某些条件下我希望它向用户显示警报 基本上告诉他们出了问题 然而 我见过的大多数例子都要求警报在ContentView或以其他方
  • `navigator.geolocation.getCurrentPosition()` 在 iOS PWA 上挂起

    我有这个片段 const getCurrentPosition gt new Promise
  • 每 24 小时触发一次方法

    我正在尝试每天在给定时间触发一个方法 我尝试了一些方法 但我无法真正使其发挥作用 任何意见 将不胜感激 此外 如果无论应用程序是否打开它都会触发 那就更理想了 这可能吗 UI本地通知 http developer apple com lib
  • (Kiss)XML xpath 和默认命名空间

    我正在开发一个 iPhone 项目 需要解析一些 xml xml 可能包含也可能不包含默认名称空间 我需要知道如何解析 xml 以防它使用默认命名空间 由于我需要读取和写入 xml 因此我倾向于使用 KissXML 但我愿意接受建议 这是我
  • iOS:生成pdf时绘制文本时如何设置字体?

    我在ios应用程序中使用drawpdf函数生成pdf 同时调用nsobject类中的drawtext函数 它根据我指定的框架和字符串清楚地绘制文本 我的代码是 void drawText NSString textToDraw inFram
  • AVAssetExportSession 无法导出从 iCloud 下载的视频

    我正在尝试创建从用户相册中选择的视频的缩小版本 输出的最大尺寸为 720p 因此 在检索视频时 我使用 mediumQualityFormat as the deliveryMode 如果用户设备中不存在原始视频或其中等质量版本 这会导致
  • UIViewControllerAnimatedTransitioning:旋转更改后黑屏片段

    我已经创建了一个视图控制器转换 只要我不更改设备方向 一切都正常 图 1 显示了应有的屏幕 然后我切换到下一个视图控制器 在其中更改方向 现在我回到第一个视图控制器并再次切换方向 然后我得到的结果如图 2 所示 出现黑色边框 请不要介意屏幕
  • iOS 7 上 Safari 浏览器的用户代理

    我只想在带有 Safari 浏览器的 iPhone 和 iPod 中打开我的网站 对于 Chrome Dolphin 等任何其他浏览器 它不应该打开 但目前我从几乎所有设备获得相同的用户代理 对于Safari User Agent Stri
  • 访问目标 c 中的类方法。使用 self 还是类名?

    我正在学习 iOS 编程 并且对以下有关关键字 self 的使用的代码感到困惑 据我了解 self就像Java的this 它指的是当前实例 当我想调用类方法时 通常的方式应该是这样 PlayingCard validSuits 但是侵入实例
  • TableViewController 的 viewDidLoad 未触发

    我一直在关注这个tutorial http www appcoda com ios programming sidebar navigation menu 有一个滑出式菜单 我添加了一个 TableViewController 它将显示文章
  • 隐藏选项卡栏项目并对齐其他选项卡项目

    在我的应用程序中 我有 4 个选项卡栏项目 我正在 XIB 文件中添加这 4 个选项卡栏项目 最初我必须显示 3 个选项卡栏项目 同步后我必须在我的应用程序中显示第 4 个选项卡栏项目 因此 为此 我使用以下代码隐藏第四个选项卡栏项目 se

随机推荐

  • 什么是CSMA/CD

    英文全称 Carrier Sense Multiple Access Collision Detection 载波侦听多路访问 冲突检测协议 CSMA CD 这种协议已广泛应用于局域网中 是广播型信道中采用一种随机访问技术的竞争型访问方法
  • windows下更改鼠标滚轮方向

    本来鼠标滚轮的方向无所谓 正确 与否 win下和mac下方向相反 只要习惯即可 但从win下切换到mac后 本来是想把鼠标方向调成跟win下一致 结果这么一反转 连多指手势的 左右 都反了 苹果 算你狠 于是我只有习惯所谓的 自然 滚动 习
  • 二维数组定义

    二维数组定义 1 方法一 int a new int m for int i 0 i
  • XD插件PhotoSplash2的用法

    1 安装 略 2 在画布上插入5个矩形 3 全部选中 并点击插件photosplash2 4 查询框中输入 flower 自动按照选中的矩形数量 选择照片 按 Apply 5 photos 5 效果
  • 如何面试Python 后端工程师(持续更新)

    看到 如何面试Python后端工程师 这个问题下一位大牛罗列的问题 感觉挺有价值 现在记在这里 找出这些问题的答案 持续更新 一 语言 1 推荐一本看过最好的python书籍 拉开话题好扯淡 目前所知道的 看过的就是 Python 核心编程
  • drop、truncate和delete的区别

    drop truncate和delete的区别 1 DELETE语句执行删除的过程是每次从表中删除一行 并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作 TRUNCATE TABLE 则一次性地从表中删除所有的数据并不把
  • 直接插入排序(C)

    直接插入排序 算法描述 所谓直接插入排序 就是从插入第1个数值开始 存在第0位 直至插入第n个数值 当插入第n个数值时 前面n 1个数值已经是排好序的 插入完第n个数值时排序结束 假设 数据集合为N 有n个数据 i 1 为第1个数值 第一步
  • 关于Qt 中update()和repaint()的区别

    void QWidget repaint int x int y int w int h bool erase TRUE 槽 通过立即调用paintEvent 来直接重新绘制窗口部件 如果erase为真 Qt在paintEvent 调用之前
  • RPM安装和卸载

    rpm 是redhat公司出的一个包管理工具 redhat package manager由于我们这是虚拟机 它有光驱 我们可以把光驱挂载一下mount dev cdrom mnt cd mnt lscd packages 这个目录下红色的
  • 支付宝数字化经营能加盟吗?真实情况原来是这样!(深度好文)

    去年支付宝的刷脸支付之火相信大家都知道 项目是个好项目 就是被那批做微商会销的人玩坏了 他们硬是把刷脸支付玩成了一个传销骗局 导致现在人家一说刷脸支付创业项目 就说是个骗局 连正规公司都受到了牵连 典型的一粒老鼠屎坏了锅粥 虽然刷脸支付肯定
  • Pygame 官方文档 - pygame.key

    pygame key 与键盘相关的 Pygame 模块 pygame key get focused 当窗口获得键盘的输入焦点时返回 True pygame key get pressed 获取键盘上所有按键的状态 pygame key g
  • c++复制省略

    复制省略问题 问题背景 工作背景 在工作过程中间 由于团队已经使用gcc7编译器并且支持c 17标准的使用 我们在大量代码内使用了tuple结合结构化绑定的代码来替代之前的返回结构体的模式 使用引用传递出参的模式 下面是几个模式的案例 返回
  • 虚拟服务器共用,vm共享虚拟主机(vmware共享的虚拟机)

    共享虚拟机 是网络中有多台VMware Workstation 在其中启用 共享虚拟机 功能后 假设这台主机为A 其他安装VMware Workstation 的主机 假设主机为B 1 使用共享文件夹 不稳定 容易保存失败2 电脑A扩展屏幕
  • 二叉树的前序遍历、中序遍历、后续遍历和层序遍历

    题目 L2 004 这是二叉搜索树吗 25 分 L2 006 树的遍历 25 分 L2 011 玩转二叉树 25 分 L2 035 完全二叉树的层序遍历 25 分 L3 010 是否完全二叉搜索树 30 分 代码 L2 004 这是二叉搜索
  • IntelliJ IDEA 设置自动导入maven依赖

    1 前言 maven自动导入依赖 如果打开 因为maven中一切皆资源 自己写的也会成为Maven中的资源 所以如果在pom中写入的坐标错误 那么只要自动导入 就会去指定的maven仓库中创建资源 文件夹等 对于新版2020的idea 好像
  • 计算机网络知识总结及知识网图

    目录 相关课程链接 第一章 计算机网络体系结构 知识网图 计算机网络分成的基本原则 TCP IP模型和OSI参考模型的比较 计算机网络与分布式计算机系统的主要区别 端到端通信与点到点通信的区别 第二章 物理层 知识网图 奈特斯特定理得到的结
  • vue路由拦截,路由嵌套,

    系列文章目录 提示 这里可以添加系列文章的所有文章的目录 目录需要自己手动添加 例如 第一章 Python 机器学习入门之pandas的使用 提示 写完文章后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 系列文章目录 前言 一
  • Cloudflare CDN 定时检测并更换优质IP

    可能有人觉得 Cloudflare 是减速 CDN 这结论应该算是一半对 一半错 相对于的大陆以及大陆周边较近的香港 日本 韩国等的服务器来讲 套上 Cloudflare 的 CDN 确实可能起到反效果或者没效果 但是 距离大陆偏远地区的服
  • 阿里java面试官问:写一个你认为最好的单例模式?怒写了7个

    面试题 写一个你认为最好的单例模式 面试考察点 考察目的 单例模式可以考察非常多的基础知识 因此对于这种问题 很多面试官都会问 小伙伴要注意 在面试过程中 但凡能够从多个维度考察求职者能力的题目 一定不会被抛弃 特别是比较泛的问题 比如 请
  • IOS Opengl ES 用多光源实现材质,阴影,高光效果

    在Opengl ES 1 0 中 要实现材质效果 往往需要光源的设置 如果环境光和漫反射光强了 材质效果难以体现 如果环境光和漫反射光弱了 材质就暗了 实现阴影效果 可以放置一个主平行光源 为了材质效果 需要将环境光设到比较弱 漫反射光设到