【问题标题】:Where to store shader code in Android app在 Android 应用中存储着色器代码的位置
【发布时间】:2014-12-19 21:29:24
【问题描述】:

我开始使用 Android (5.0.1) 上的 OpenGL ES2.0,API 级别 19。我应该在哪里存储着色器代码?第一个示例将着色器直接编码为字符串。

我想将着色器代码放在一个单独的文件中以提高可用性。存储和加载顶点和片段着色器的最佳做法是什么?

【问题讨论】:

    标签: android opengl-es opengl-es-2.0 shader


    【解决方案1】:

    有两个主要选项:

    • 将它们作为文本文件存储在项目的assets 文件夹中。加载着色器:

      1. 使用上下文的getAssets() 方法获取AssetManager
      2. AssetManager 上调用open(),传入着色器的文件名。这会给你一个InputStream
      3. InputStream 读取着色器代码,并将其存储在String 中。
      4. 拨打close()InputStream
    • 将它们存储在项目的res/raw 文件夹中。加载着色器:

      1. 使用上下文的getResources() 方法获取Resources
      2. Resources 上调用openRawResource(),传入资源ID (R.raw.<name>)。这会给你一个InputStream
      3. (同上)
      4. (同上)

    我不认为有一个重要的理由偏爱其中一个。主要区别在于您使用文件名来访问资产,而您使用自动分配的资源 ID 来访问资源。您更喜欢哪个是您的偏好问题。

    【讨论】:

    • 谢谢。我尝试了“资源”方式,效果很好。但是,我发现将文件内容作为字符串读取是相当困难的。我没有找到其他方法,然后阅读所有线路并连接它们。但后来我不得不手动添加换行符。着色器的最佳文件扩展名是什么?
    • 如果您使用“.fs”文件扩展名,Android 会将其解释为 Renderscript 过滤器脚本并为您提供一些语法高亮显示。
    • These 是官方扩展
    • 对于 IntelliJ 的用户(包括 Android Studio,也包括未修改的 IntelliJ IDEA/其他修改),至少有一个插件可以处理 .frag、.vert、.glsl 和其他与着色器。这给出了语法高亮和一些建议。有总比没有好
    • 对于资源与资产,请记住资源要求着色器具有不同的名称。它忽略扩展名。在这些情况下,最好使用 .glsl 扩展名并将它们命名为 shadername_vshadername_f,具体取决于它是顶点着色器还是片段着色器
    【解决方案2】:

    喂! 如果有人在打开 res/raw 文件夹中扩展名为 .glsl 的文件时遇到问题,请执行以下操作: 1)打开File > Settings 2)在 inpit 行写File types 3)找到并选择OpenGL Shading Language(检查是否安装了GLSL Support插件) 4)添加注册模式*.glsl通配符 5)ApplyOK

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-04
      相关资源
      最近更新 更多