GLES2和GLES3之间的一般差异

本页面记录了GLES2和GLES3之间的差异, 这些差异是经过设计的, 不是因bug造成的. 可能有些差异是无心之过, 但它们应该被报告为bug.

注解

"GLES2" 和 "GLES3" 是Godot中, 两个基于opengl呈现后端的名称. 在图形应用程序编程接口方面,GLES2后端映射到桌面的OpenGL 2.1, 移动版的OpenGL ES 2.0和web版的WebGL 1.0.GLES3后端映射到桌面的OpenGL 3.3, 移动版的OpenGL ES 3.0和web版的WebGL 2.0.

粒子

GLES2不能使用: 参考:` 粒子 <类_粒子>` 或: 参考:` 二维粒子 <类_二维粒子>` 节点, 因为它们需要高级GPU特性. 相反, 使用: 参考:CPU 粒子 <类_CPU粒子> 或: 参考:CPU 二维粒子 <类_CPU二维粒子>, 它提供了与: 参考:` 粒子材质 <类_粒子材质>` 类似的接口.

小技巧

粒子和二维粒子可以通过编辑器中的 "转换为CPU粒子" 选项, 转换为它们的等效CPU节点.

"屏幕_纹理" 变频译码

在GLES2中,"屏幕_纹理"(通过: 参考:` 着色器纹理 <类_着色器纹理>` 访问)没有计算变频译码. 所以当访问不同的细节级别时, 纹理不会变得模糊.

"深度图纹理"

虽然GLES2在着色器中支持 "深度图纹理", 可能在一些旧的硬件上(特别是移动设备)不能工作.

色彩空间

GLES2 and GLES3 are in different color spaces. This means that colors will appear slightly different between them especially when lighting is used.

如果您在游戏中同时使用GLES2和GLES3, 您可以使用 "如果"(if)语句检查输出是否为sRGB, 使用 OUTPUT_IS_SRGB . OUTPUT_IS_SRGB 在GLES2中返回 true , 在GLES3中返回 false .

高动态范围

GLES2 is not capable of using High Dynamic Range (HDR) rendering features. If HDR is set for your project, or for a given viewport, Godot will still use Low Dynamic Range (LDR) which limits viewport values to the 0-1 range.

The Viewport Debanding property and associated project setting will also have no effect when HDR is disabled. This means debanding can't be used in GLES2.

空间材质特性

在GLES2中, 在: 参考:` 空间材质 <类_空间材质>` 中缺少以下高级渲染特性:

  • Refraction(折射)

  • Subsurface Scattering(表面下散射)

  • Anisotropy(各向异性)

  • Clearcoat(清漆)

  • 深度映射

使用空间材质时, 它们甚至不会出现在编辑器中.

在自定义: 参考:` 着色器材质 <类_着色器材质>` 中, 您可以为这些特性设置值, 但它们是非功能性的. 例如, 您仍然可以在着色器中设置内置的 "次表面散射"(通常会增加次表面散射), 但什么都不会发生.

环境特性

在GLES2中, 缺少: 参考:` 环境 <类_环境>` 中的以下特性:

  • 自动曝光

  • 色调映射

  • 屏幕空间反射

  • 屏幕空间环境遮挡

这意味着在GLES2环境中, 您只能设置:

  • 天空(包括程序生成天空)

  • 环境光

  • 景深

  • 辉光(也称为光晕)

  • 调整

全局光照探测器

: 参考:` 全局光照探测器 <类_全局光照探测器>` 在GLES2中不起作用. 而是使用: 参考:` 烘焙灯光贴图 <类_烘焙灯光贴图>`. 有关烘焙灯光贴图工作原理的描述, 请参见: 参考:` 烘焙灯光贴图教程 <文档_烘焙_灯光贴图>`.

接触阴影

GLES2中不支持 "阴影_接触" 属性: 参考:` 灯光 <类_灯光>`, 并且无效.

灯光性能

在GLES2中, 使用多盏灯光会造成性能不佳, 因为每盏灯光都在一个单独的渲染通道中处理(与GLES3相反,GLES3是一次性完成渲染). 尝试将场景灯光控制在尽可能少的情况, 以达到最好效果.

纹理压缩

在移动端,GLES2需要进行纹理压缩, 而GLES3需要ETC2纹理压缩. 默认启用ETC2纹理压缩, 因此, 如果使用GLES2导出到移动端, 请确保在项目设置中设定了 渲染/显存_压缩/导入_etc压缩, 然后重新导入纹理.

警告

由于ETC不支持透明度, 您必须重新导入包含alpha通道的纹理, 以使用未压缩, 有损或无损压缩模式(而不是视频RAM). 这可以在文件系统栏中选择它们后, 在导入栏中完成.

融合变形

在GLES2中不支持融合变形.

着色语言

GLES3提供了许多GLES2没有提供的内置函数. 下面是在GLES2中不可用或支持有限的函数列表.

有关内置GLSL函数的完整列表, 请参见: 参考:` 着色语言文档 <文档_着色_语言>`.

函数

vec_type modf ( vec_type x, out vec_type i )

vec_int_type floatBitsToInt ( vec_type x )

vec_uint_type floatBitsToUint ( vec_type x )

vec_type intBitsToFloat ( vec_int_type x )

vec_type uintBitsToFloat ( vec_uint_type x )

ivec2 textureSize ( sampler2D_type s, int lod )

请参阅下面的解决方法

ivec2 textureSize ( samplerCube s, int lod )

请参阅下面的解决方法

vec4_type texture ( sampler_type s, vec_type uv [, float bias] )

偏差 在顶点着色器中不可用

vec4_type textureProj ( sampler_type s, vec_type uv [, float bias] )

vec4_type textureLod ( sampler_type s, vec_type uv, float lod )

只在某些硬件的顶点着色器中可用

vec4_type textureProjLod ( sampler_type s, vec_type uv, float lod )

vec4_type textureGrad ( sampler_type s, vec_type uv, vec_type dPdx, vec_type dPdy )

vec_type dFdx ( vec_type p )

vec_type dFdy ( vec_type p )

vec_type fwidth ( vec_type p )

注解

GLES2的GLSL中没有的函数是用Godots自己的shader标准库添加的, 这些函数在GLES2中的表现可能比GLES3差.

textureSize() 工作方法

GLES2不支持 textureSize() . 你可以用老式的方式获得纹理的大小, 通过传入一个带有纹理大小的uniform.

// In the shader:
uniform sampler2D textureName;
uniform vec2 textureName_size;
# In GDScript:
material_name.set_shader_param("textureName", my_texture)
material_name.set_shader_param("textureName_size", my_texture_size)

内置变量和渲染模式

Godot还提供了许多内置变量和渲染模式. 有些变量在GLES2中无法被支持. 以下是一些内置变量和渲染模式的列表, 这些变量和渲染模式在写入GLES2后端时不会有任何影响, 甚至可能会导致问题.

可变和渲染模式

ensure_correct_normals

INSTANCE_ID

DEPTH

ANISOTROPY

ANISOTROPY_FLOW

SSS_STRENGTH