在主贴:
【着色器介绍】Godot着色器从入门到入门 https://tieba.baidu.com/p/6604817792
中,漏讲了两个非常重要的知识点,因为太重要了,所以在这里补充:
1.对于Sprite3D,在给它material_override添加材质后,你第一个uniform sampler2D的图片是固定获取自Sprite3D的Texture属性的:
![](http://tiebapic.baidu.com/forum/w%3D580/sign=ee6f9852af0e7bec23da03e91f2fb9fa/c256618b4710b9121f927aa3d4fdfc03934522e7.jpg?tbpicau=2024-09-19-05_060ff0588f69a1a90cecf5e1c4359f80)
着色器代码(将第一个uniform sampler2D加载的图片渲染):
![](http://tiebapic.baidu.com/forum/w%3D580/sign=d787806c363fb80e0cd161df06d02ffb/b5e6de11728b47106f7c7191d4cec3fdfd0323e7.jpg?tbpicau=2024-09-19-05_481f8297a14ff87dbb9ebe30183377dc)
两个对应的uniform sampler2D:
![](http://tiebapic.baidu.com/forum/w%3D580/sign=340c3c58f2dde711e7d243fe97eecef4/db789494a4c27d1e3375b7990cd5ad6edcc438e7.jpg?tbpicau=2024-09-19-05_78201460cf559e30a50b39f6298c27b8)
但实际上,第一个uniform sampler2D渲染的就是Texture属性加载的图片!!!!:
![](http://tiebapic.baidu.com/forum/w%3D580/sign=6160c28143e736d158138c00ab514ffc/4857aa12c8fcc3ce1a93456e8545d688d53f20e7.jpg?tbpicau=2024-09-19-05_580ca5beb5b20d8eb118c99bca0110ae)
无论你第一个uniform sampler2D中加载了什么,着色器都会读取Texture属性!!!!!!!
2.在shader_type spatial下的颜色使用线性空间!!!
在shader_type spatial下,如果你直接用vec3来表示颜色,则实际渲染出的颜色会偏亮:
![](http://tiebapic.baidu.com/forum/w%3D580/sign=a182ed8a21d12f2ece05ae687fc3d5ff/b655dbfcc3cec3fd266d2b28c188d43f869427e7.jpg?tbpicau=2024-09-19-05_96b935cf17581e95fb25cc5ad0bcf258)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=037f298261c6a7efb926a82ecdfbafe9/7259c11b0ef41bd5490064a946da81cb38db3de7.jpg?tbpicau=2024-09-19-05_b6eb927f8a8d78030f3bb14f5fa65308)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=f24000558c504fc2a25fb00dd5dce7f0/ccbaef039245d68809513ef9b3c27d1ed31b24e7.jpg?tbpicau=2024-09-19-05_8defc09d29f03df258a42e8ab49be1a3)
而这要怎么解决呢?官方给出的解释是用hint_color:
这样,取到的颜色和渲染的就一致了
![](http://tiebapic.baidu.com/forum/w%3D580/sign=443ef6afc262853592e0d229a0ee76f2/9d02c588d43f87947bacc473c51b0ef41ad53ae7.jpg?tbpicau=2024-09-19-05_7999eedbf8740365f575271ed5eeff80)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=eabf9643ae389b5038ffe05ab534e5f1/cc89d0fdfc0392450ae66d529094a4c27c1e25e7.jpg?tbpicau=2024-09-19-05_27644fa74c2a9f0fc3ca7941913dfb26)
而图片在渲染时也会变亮:
![](http://tiebapic.baidu.com/forum/w%3D580/sign=587eb8842e01213fcf334ed464e636f8/de47a9a1cd11728b927e007fdffcc3cec2fd2ce7.jpg?tbpicau=2024-09-19-05_90e44f329a8ba2816df93cca37aa825d)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=8f898fbc382eb938ec6d7afae56385fe/c7bbd0cec3fdfc03492b6fe5c33f8794a5c226e7.jpg?tbpicau=2024-09-19-05_70cebef76b27be9d5e7bcef06a84c89a)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=afac6c0f9235e5dd902ca5d746c7a7f5/d9cfc73f8794a4c29d706b7619f41bd5ac6e39e7.jpg?tbpicau=2024-09-19-05_b4e0d08dd11b9b55503d24a1f35e1b61)
而这又要怎么解决呢?官方给出的解释是用hint_albedo:
![](http://tiebapic.baidu.com/forum/w%3D580/sign=6756223d58c2d562f208d0e5d71090f3/f3448145d688d43f59fa1daf6a1ed21b0ff43be7.jpg?tbpicau=2024-09-19-05_3526485f9c0616dde614771a65944adb)
(这里就不做演示了)
但问题来了,如果我不想用hint_color和hint_albedo就想表示正确的颜色怎么办?
(况且像ViewportTexture和CameraTexture这种动态的资源是无法用hint_albedo的)
那就自己转换线性颜色,至于方法,官方color.h源文件中就有这个函数方法(172行处):
![](http://tiebapic.baidu.com/forum/w%3D580/sign=675b5cb0f01190ef01fb92d7fe1a9df7/88d3b7c27d1ed21bec9aa2b8ba6eddc450da3fe7.jpg?tbpicau=2024-09-19-05_2351decc226af6cb17f76645b2d7b299)
链接:github.com/godotengine/godot/blob/master/core/color.h
我们只需要抄过来改一下格式就行了:
![](http://tiebapic.baidu.com/forum/w%3D580/sign=06b35e7c87ef76c6d0d2fb23ad17fdf6/ab856e1ed21b0ef4f8bb1403cac451da80cb3ee7.jpg?tbpicau=2024-09-19-05_13b264c57ae898e8218ebe07e57da5b0)
这样,即使是ViewportTexture也不会有色差了!
![](http://tiebapic.baidu.com/forum/w%3D580/sign=f95101636cec54e741ec1a1689399bfd/7dcc5410b912c8fc1ba07a90eb039245d78821e7.jpg?tbpicau=2024-09-19-05_605dc788b2c7159f5be75aca3f81e64b)
【着色器介绍】Godot着色器从入门到入门 https://tieba.baidu.com/p/6604817792
中,漏讲了两个非常重要的知识点,因为太重要了,所以在这里补充:
1.对于Sprite3D,在给它material_override添加材质后,你第一个uniform sampler2D的图片是固定获取自Sprite3D的Texture属性的:
![](http://tiebapic.baidu.com/forum/w%3D580/sign=ee6f9852af0e7bec23da03e91f2fb9fa/c256618b4710b9121f927aa3d4fdfc03934522e7.jpg?tbpicau=2024-09-19-05_060ff0588f69a1a90cecf5e1c4359f80)
着色器代码(将第一个uniform sampler2D加载的图片渲染):
![](http://tiebapic.baidu.com/forum/w%3D580/sign=d787806c363fb80e0cd161df06d02ffb/b5e6de11728b47106f7c7191d4cec3fdfd0323e7.jpg?tbpicau=2024-09-19-05_481f8297a14ff87dbb9ebe30183377dc)
两个对应的uniform sampler2D:
![](http://tiebapic.baidu.com/forum/w%3D580/sign=340c3c58f2dde711e7d243fe97eecef4/db789494a4c27d1e3375b7990cd5ad6edcc438e7.jpg?tbpicau=2024-09-19-05_78201460cf559e30a50b39f6298c27b8)
但实际上,第一个uniform sampler2D渲染的就是Texture属性加载的图片!!!!:
![](http://tiebapic.baidu.com/forum/w%3D580/sign=6160c28143e736d158138c00ab514ffc/4857aa12c8fcc3ce1a93456e8545d688d53f20e7.jpg?tbpicau=2024-09-19-05_580ca5beb5b20d8eb118c99bca0110ae)
无论你第一个uniform sampler2D中加载了什么,着色器都会读取Texture属性!!!!!!!
2.在shader_type spatial下的颜色使用线性空间!!!
在shader_type spatial下,如果你直接用vec3来表示颜色,则实际渲染出的颜色会偏亮:
![](http://tiebapic.baidu.com/forum/w%3D580/sign=a182ed8a21d12f2ece05ae687fc3d5ff/b655dbfcc3cec3fd266d2b28c188d43f869427e7.jpg?tbpicau=2024-09-19-05_96b935cf17581e95fb25cc5ad0bcf258)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=037f298261c6a7efb926a82ecdfbafe9/7259c11b0ef41bd5490064a946da81cb38db3de7.jpg?tbpicau=2024-09-19-05_b6eb927f8a8d78030f3bb14f5fa65308)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=f24000558c504fc2a25fb00dd5dce7f0/ccbaef039245d68809513ef9b3c27d1ed31b24e7.jpg?tbpicau=2024-09-19-05_8defc09d29f03df258a42e8ab49be1a3)
而这要怎么解决呢?官方给出的解释是用hint_color:
这样,取到的颜色和渲染的就一致了
![](http://tiebapic.baidu.com/forum/w%3D580/sign=443ef6afc262853592e0d229a0ee76f2/9d02c588d43f87947bacc473c51b0ef41ad53ae7.jpg?tbpicau=2024-09-19-05_7999eedbf8740365f575271ed5eeff80)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=eabf9643ae389b5038ffe05ab534e5f1/cc89d0fdfc0392450ae66d529094a4c27c1e25e7.jpg?tbpicau=2024-09-19-05_27644fa74c2a9f0fc3ca7941913dfb26)
而图片在渲染时也会变亮:
![](http://tiebapic.baidu.com/forum/w%3D580/sign=587eb8842e01213fcf334ed464e636f8/de47a9a1cd11728b927e007fdffcc3cec2fd2ce7.jpg?tbpicau=2024-09-19-05_90e44f329a8ba2816df93cca37aa825d)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=8f898fbc382eb938ec6d7afae56385fe/c7bbd0cec3fdfc03492b6fe5c33f8794a5c226e7.jpg?tbpicau=2024-09-19-05_70cebef76b27be9d5e7bcef06a84c89a)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=afac6c0f9235e5dd902ca5d746c7a7f5/d9cfc73f8794a4c29d706b7619f41bd5ac6e39e7.jpg?tbpicau=2024-09-19-05_b4e0d08dd11b9b55503d24a1f35e1b61)
而这又要怎么解决呢?官方给出的解释是用hint_albedo:
![](http://tiebapic.baidu.com/forum/w%3D580/sign=6756223d58c2d562f208d0e5d71090f3/f3448145d688d43f59fa1daf6a1ed21b0ff43be7.jpg?tbpicau=2024-09-19-05_3526485f9c0616dde614771a65944adb)
(这里就不做演示了)
但问题来了,如果我不想用hint_color和hint_albedo就想表示正确的颜色怎么办?
(况且像ViewportTexture和CameraTexture这种动态的资源是无法用hint_albedo的)
那就自己转换线性颜色,至于方法,官方color.h源文件中就有这个函数方法(172行处):
![](http://tiebapic.baidu.com/forum/w%3D580/sign=675b5cb0f01190ef01fb92d7fe1a9df7/88d3b7c27d1ed21bec9aa2b8ba6eddc450da3fe7.jpg?tbpicau=2024-09-19-05_2351decc226af6cb17f76645b2d7b299)
链接:github.com/godotengine/godot/blob/master/core/color.h
我们只需要抄过来改一下格式就行了:
![](http://tiebapic.baidu.com/forum/w%3D580/sign=06b35e7c87ef76c6d0d2fb23ad17fdf6/ab856e1ed21b0ef4f8bb1403cac451da80cb3ee7.jpg?tbpicau=2024-09-19-05_13b264c57ae898e8218ebe07e57da5b0)
这样,即使是ViewportTexture也不会有色差了!
![](http://tiebapic.baidu.com/forum/w%3D580/sign=f95101636cec54e741ec1a1689399bfd/7dcc5410b912c8fc1ba07a90eb039245d78821e7.jpg?tbpicau=2024-09-19-05_605dc788b2c7159f5be75aca3f81e64b)