iPhone 上基于位移贴图的 3D 效果

2023-12-27

我正在尝试制作一个使用置换贴图实现 3D 效果的应用程序。在 Flash 中,可以使用位移过滤器来完成,如下所示:http://flashflex.com/pixel-bender-displacement-map-fakes-3d-effect-update/ http://flashflex.com/pixel-bender-displacement-map-fakes-3d-effect-update/。很少有应用程序可以在 iPhone 上执行此操作,如下所示:www.youtube.com/watch?v=NvCHHUN8nnE

我想知道他们如何执行此操作。

我正在尝试使用此处描述的基于位移图的技术:www.cocos2d-iphone.org/forum/topic/11659,但动态完成似乎很慢。

任何指针将不胜感激。

Thanks


也许在 OpenGL ES 2.0 中实现置换贴图的最简单方法也可能是最快的。您需要两个纹理,一个包含颜色(常规纹理)和一个置换贴图。当正常采样常规纹理时,您的片段着色器将如下所示:

uniform sampler2D myTexture;
varying vec2 texcoords;

void main()
{
    gl_FragColor = texture2D(myTexture, texcoords);
}

这是非常简单的事情。现在,要实现位移贴图,您需要:

uniform sampler2D myTexture;
uniform sampler2D myDisplacementMap;
varying vec2 texcoords;

void main()
{
    vec2 displacement = 0.1 * texture2D(myDisplacementMap, texcoords).rg;
    gl_FragColor = texture2D(myTexture, texcoords + displacement);
}

这也很简单。您还有另一个纹理,其中红色和绿色用作位移的 x 和 y。然而,通过这种方式,您只能获得静态的、与视图无关的位移。为了获得真实的位移,需要生成纹理切线和双切线 http://www.terathon.com/code/tangent.html其中包含对象空间中纹理轴的方向(一个棘手的概念,请阅读文章)。拥有它们后,您所需要的只是对象空间眼睛位置(可以通过将顶点位置乘以顶点着色器中的模型视图投影逆来计算),并且通过将其投影到切线/双切线向量上,您可以按顺序调制位移依赖于视图:

attribute vec3 position, tangent, bitangent;
attribute vec2 texcoord;
varying vec2 texcoords;
varying vec3 eye_dir, tan, bitan;
uniform matrix4f modelviewProjectionMatrix;
uniform matrix4f modelviewProjectionMatrixInverse;

void main()
{
    gl_Position = modelviewProjectionMatrix * vec4(position, 1.0);
    tan = tangent;
    bitan = bitangent;
    texcoords = texcoord;
}

(那是顶点着色器),这里是片段着色器:

uniform sampler2D myTexture;
uniform sampler2D myDisplacementMap;
varying vec2 texcoords;
varying vec3 eye_dir, tan, bitan;

void main()
{
    vec2 eyen = normalize(eye_dir);
    vec2 modulation = vec2(dot(eyen, normalize(tan)), dot(eyen, normalize(bitan)));
    vec2 displacement = 0.1 * texture2D(myDisplacementMap, texcoords).rg * modulation;
    gl_FragColor = texture2D(myTexture, texcoords + displacement);
}

这应该可以解决问题......(请注意,我是从头开始写的,所以如果有任何错误,请随时发表评论)

EDIT:并且出现错误,我将参数顺序交换为texture2D(采样器先行)。

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

iPhone 上基于位移贴图的 3D 效果 的相关文章

  • 无法将 NSMutableDictionary 发送到另一个类

    All 我试图将 NSMutableDictionary 响应 发送到我的另一个类 或者更确切地说 让另一个类从这个类中提取字典 当另一个类使用 getResponse 方法时 它返回 null 我附加的代码是我的 XML 解析器 它将我需
  • 如何以编程方式创建选项卡栏

    大家好 我有基于导航的应用程序 其中我也需要在视图之一中实现选项卡栏 在一个视图中我需要 5 个选项卡 有人可以建议我以编程方式创建选项卡栏吗 每个选项卡应导航到另一个 xib 建议始终受到赞赏 问候 以下是 Apple 提供的用于以编程方
  • 从本机 iPhone 应用程序访问 UIWebView 本地存储数据

    我正在编写一个包含 UIWebView 组件的本机 iPhone 应用程序 该组件访问互联网 Web 应用程序 并且该 Web 应用程序使用 HTML5 本地存储离线存储数据 是否可以从本机应用程序访问此本地存储数据 我想做类似的事情 简而
  • 日期时间到 NSDate

    如何转换字符串2010 11 19T20 00 00Z进入一个NSDate object 我尝试过使用 dateFormatter setDateFormat yyyy MM ddTHH mm ssZ 但看起来我的自定义格式样式错误 PS
  • 检测 iPhone 屏幕是否打开/关闭

    有没有办法检测 iPhone 的屏幕是打开还是关闭 例如 当按下手机的屏幕锁定按钮时 我一直在使用 void applicationWillResignActive UIApplication application 为此类事件做准备 在大
  • iOS 7 NS 单线程安全合并冲突

    重新排序两行后 在单线程应用程序上保存简单的数据时遇到问题 我已经成功地简化了编码以重现错误 并且希望其他人尝试这一点时得到第二个意见 这是一次健全性检查 因为我怀疑 iOS 7 引入的核心数据问题 而这在 iOS 6 中工作正常 首先 启
  • 如何在 iPhone 中使用 XMPPFramework 创建 MultiUserChatRoom

    我正在 iPhone 中使用 XMPPFramwwork 开发聊天应用程序 我成功完成了一对一聊天 现在我想在我的应用程序中开发多用户聊天 我尝试了以下代码 但未调用 XMPPRoomDelegate 的任何委托方法 我如何开始创建聊天室
  • 增加 iPhone 的推送通知徽章

    是否可以在收到通知时增加徽章值 或者我应该将计数作为有效负载发送吗 如果我每次都将徽章值发送为 1 那么如果应用程序未打开 我如何增加应用程序图标中的徽章值 我已经使用了这段代码 但不起作用 void application UIAppli
  • 移动物体而不实际接触物体

    我是 iPhone 开发的初学者 我一直在寻找这个问题的答案 但还没有找到任何东西 我想做的是允许用户移动对象而无需实际触摸该对象 他们可以触摸屏幕上的任何位置 并且当他们移动时 对象将从原来的位置向用户的方向移动移动但不会跳到他们的触摸位
  • UIKit SDK 3.0错误

    我正在使用 iphone sdk 3 0 beta 5 9m2735 SDK 当我尝试使用模拟器 3 0 选项编译代码时 出现以下错误 该代码针对其余所有模拟器选项进行编译 即 2 0 2 1 2 2 2 2 1 编译我的代码时出现以下错误
  • 如何打开/关闭 iPhone 相机闪光灯 swift 2?

    我正在寻找如何打开 关闭 iPhone 的相机闪光灯 我发现了这个 IBAction func didTouchFlashButton sender AnyObject let avDevice AVCaptureDevice defaul
  • Xcode 6 Save for Enterprise Deployment 不再为 ipa 创建 plist?

    Xcode 5 帮助为企业 ipa 创建 plist 描述符 Xcode 6 6A313 仅创建 ipa 这是错误还是有意更改 如果是这样 退后一步的原因是什么 如果我之前没有使用 Xcode 5 生成 plist 我需要自己手动构建它 您
  • iPhone 中的 UIGlassButton

    有人使用 Glass Button 提交过申请吗 获得批准了吗 我正在尝试使用彩色圆形按钮 但不想使用这些技巧 如何在 iPhone 上设置按钮背景颜色 https stackoverflow com questions 372731 ho
  • 允许用户从 UILabel 选择文本进行复制[重复]

    这个问题在这里已经有答案了 我有一个 UILabel 但如何允许用户选择其文本的一部分 我不希望用户能够编辑文本 也不希望标签 文本字段具有边框 这是不可能的UILabel 你应该使用UITextView为了那个原因 只需使用禁用编辑即可t
  • iPhone Core Graphics 子视图的粗虚线

    我有一个UIView在其中我通过覆盖使用 Core Graphics 画了一条线drawRect 该视图还包含一个子视图 该子视图也绘制一条线 然而 虽然两个视图都使用几乎相同的代码 至少出于测试目的 但在它们上绘制的线看起来并不相同 正如
  • 如何在 Monotouch 中对 UIImageView 进行运动模糊效果?

    在 MonoTouch 中进行实时运动模糊的方法是什么 当滚动惯性图片库时 我需要在 UIImageView 上应用运动模糊效果 以强度和方向作为参数 就像在 Photoshop 中一样 我在 CocoaTouch 或 CoreAnimat
  • iPhone - 创建图像网格列表

    我正在开发一个应用程序 它从网站获取图像并使用网格视图向用户显示 例如Apple的照片应用程序 当您点击图像时 我会推送一个显示图像信息和其他内容的视图控制器 实现这个的更好方法是什么 我想到了自定义 UITableViewCell 我见过
  • UITextField 字体大小在开始或停止输入字符时发生变化

    我见过很多线程 但没有找到解决这个问题的任何具体解决方案 我使用 XIB 创建了 UITextfield 尚未以编程方式对该字段执行任何操作 一旦我开始打字 文本字段的字体就会改变 一旦我将焦点移出文本字段 并且随着键盘消失 字体大小就会减
  • 在 Objective C 中使用下划线作为属性名称前缀 [重复]

    这个问题在这里已经有答案了 我以前避免在变量名中使用下划线 这可能是我大学 Java 时代的遗留下来的 因此 当我在 Objective C 中定义属性时 我自然会这样做 In the header interface Whatever N
  • Facebook oauth/access_token 丢失

    不知道我是否错过了什么 但就这样 我正在尝试为我的应用程序获取 access token 以便它可以在 facebook 上查找某些公共群组的事件 而无需用户登录 我试图从中获取 access token 这将返回一个字符串 access

随机推荐