在主贴:
【着色器介绍】Godot着色器从入门到入门 https://tieba.baidu.com/p/6604817792
中,漏讲了两个非常重要的知识点,因为太重要了,所以在这里补充:
1.对于Sprite3D,在给它material_override添加材质后,你第一个uniform sampler2D的图片是固定获取自Sprite3D的Texture属性的:
着色器代码(将第一个uniform sampler2D加载的图片渲染):
两个对应的uniform sampler2D:
但实际上,第一个uniform sampler2D渲染的就是Texture属性加载的图片!!!!:
无论你第一个uniform sampler2D中加载了什么,着色器都会读取Texture属性!!!!!!!
2.在shader_type spatial下的颜色使用线性空间!!!
在shader_type spatial下,如果你直接用vec3来表示颜色,则实际渲染出的颜色会偏亮:
而这要怎么解决呢?官方给出的解释是用hint_color:
这样,取到的颜色和渲染的就一致了
而图片在渲染时也会变亮:
而这又要怎么解决呢?官方给出的解释是用hint_albedo:
(这里就不做演示了)
但问题来了,如果我不想用hint_color和hint_albedo就想表示正确的颜色怎么办?
(况且像ViewportTexture和CameraTexture这种动态的资源是无法用hint_albedo的)
那就自己转换线性颜色,至于方法,官方color.h源文件中就有这个函数方法(172行处):
我们只需要抄过来改一下格式就行了:
这样,即使是ViewportTexture也不会有色差了!
【着色器介绍】Godot着色器从入门到入门 https://tieba.baidu.com/p/6604817792
中,漏讲了两个非常重要的知识点,因为太重要了,所以在这里补充:
1.对于Sprite3D,在给它material_override添加材质后,你第一个uniform sampler2D的图片是固定获取自Sprite3D的Texture属性的:
着色器代码(将第一个uniform sampler2D加载的图片渲染):
两个对应的uniform sampler2D:
但实际上,第一个uniform sampler2D渲染的就是Texture属性加载的图片!!!!:
无论你第一个uniform sampler2D中加载了什么,着色器都会读取Texture属性!!!!!!!
2.在shader_type spatial下的颜色使用线性空间!!!
在shader_type spatial下,如果你直接用vec3来表示颜色,则实际渲染出的颜色会偏亮:
而这要怎么解决呢?官方给出的解释是用hint_color:
这样,取到的颜色和渲染的就一致了
而图片在渲染时也会变亮:
而这又要怎么解决呢?官方给出的解释是用hint_albedo:
(这里就不做演示了)
但问题来了,如果我不想用hint_color和hint_albedo就想表示正确的颜色怎么办?
(况且像ViewportTexture和CameraTexture这种动态的资源是无法用hint_albedo的)
那就自己转换线性颜色,至于方法,官方color.h源文件中就有这个函数方法(172行处):
我们只需要抄过来改一下格式就行了:
这样,即使是ViewportTexture也不会有色差了!