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). 这可以在文件系统栏中选择它们后, 在导入栏中完成.

融合变形

在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