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 无法使用 ParticlesParticles2D 节点,因为这些节点都需要用到高级 GPU 特性。请换用 CPUParticlesCPUParticles2D,提供了类似 ParticlesMaterial 的接口。

小技巧

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

SCREEN_TEXTURE 多级渐远纹理

在 GLES2 中,SCREEN_TEXTURE(通过 ShaderMaterial 访问)不具有计算出的多级渐远纹理。因此使用不同 LOD 访问时,该纹理不会变得模糊。

DEPTH_TEXTURE

虽然 GLES2 支持在着色器中使用 DEPTH_TEXTURE,在一些旧硬件(尤其是移动设备)上仍可能无法工作。

色彩空间

GLES2 和 GLES3 所用的色彩空间不同。也就是说两者之间的颜色会有细微的差别,特别是在使用灯光的时候。

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

HDR

GLES2 无法使用高动态范围(High Dynamic Range、HDR)渲染特性。如果你的项目或者某个特定的视图使用了 HDR,Godot 仍会使用低动态范围(Low Dynamic Range、LDR),视图中的取值会被限制在 0-1 的范围内。

禁用 HDR 时,Viewport 的 Debanding(条带消除) 属性和相关的项目设置也会失效。所以在 GLES2 中无法使用条带消除功能。

SpatialMaterial 的特性

在 GLES2 中, SpatialMaterial 缺失如下高级渲染特性:

  • Refraction(折射)

  • 次表面散射

  • Anisotropy(各向异性)

  • Clearcoat(清漆)

  • 深度映射

使用 SpatialMaterials 时,它们甚至不会出现在编辑器中。

在自定义 ShaderMaterials 中,您可以为这些特性设置值,但它们是非功能性的。例如,您仍然可以在着色器中设置内置的 SSS(通常会增加次表面散射),但什么都不会发生。

环境特性

在 GLES2 中,Environment 缺失以下特性:

  • 自动曝光

  • 色调映射

  • 屏幕空间反射

  • 屏幕空间环境遮挡

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

  • 天空(包括程序式天空)

  • 环境光

  • 景深

  • 辉光(也称为泛光)

  • 调整

GIProbe

GIProbe 在 GLES2 中不起作用。请换用烘焙灯光贴图。有关烘焙灯光贴图工作原理的描述见烘焙灯光贴图教程

接触阴影

Lightshadow_contact 属性在 GLES2 中不被支持,没有任何效果。

灯光性能

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

纹理压缩

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

警告

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

融合变形

In GLES2, blend shapes are implemented on the CPU instead of the GPU. Accordingly, they may not perform as well as blend shapes in GLES3. To avoid performance issues when using blend shapes in GLES2, try to minimize the number of blend shapes that are updated each frame.

着色语言

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] )

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