在主贴:
【着色器介绍】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-08-06-05_d5365dd4e8f9e3e5502e758eee3c1601)
着色器代码(将第一个uniform sampler2D加载的图片渲染):
![](http://tiebapic.baidu.com/forum/w%3D580/sign=d787806c363fb80e0cd161df06d02ffb/b5e6de11728b47106f7c7191d4cec3fdfd0323e7.jpg?tbpicau=2024-08-06-05_d33cbb34159d7e04c42b343e9a5089ab)
两个对应的uniform sampler2D:
![](http://tiebapic.baidu.com/forum/w%3D580/sign=340c3c58f2dde711e7d243fe97eecef4/db789494a4c27d1e3375b7990cd5ad6edcc438e7.jpg?tbpicau=2024-08-06-05_e959f194c9b8c42f00771998916e30f2)
但实际上,第一个uniform sampler2D渲染的就是Texture属性加载的图片!!!!:
![](http://tiebapic.baidu.com/forum/w%3D580/sign=6160c28143e736d158138c00ab514ffc/4857aa12c8fcc3ce1a93456e8545d688d53f20e7.jpg?tbpicau=2024-08-06-05_ed4094e794c6fb9669fa73c3efc2e45f)
无论你第一个uniform sampler2D中加载了什么,着色器都会读取Texture属性!!!!!!!
2.在shader_type spatial下的颜色使用线性空间!!!
在shader_type spatial下,如果你直接用vec3来表示颜色,则实际渲染出的颜色会偏亮:
![](http://tiebapic.baidu.com/forum/w%3D580/sign=a182ed8a21d12f2ece05ae687fc3d5ff/b655dbfcc3cec3fd266d2b28c188d43f869427e7.jpg?tbpicau=2024-08-06-05_a49a27ed4a215224345c954c22293333)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=037f298261c6a7efb926a82ecdfbafe9/7259c11b0ef41bd5490064a946da81cb38db3de7.jpg?tbpicau=2024-08-06-05_2cac3ee592f9f6123d91afbe5baf4f40)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=f24000558c504fc2a25fb00dd5dce7f0/ccbaef039245d68809513ef9b3c27d1ed31b24e7.jpg?tbpicau=2024-08-06-05_fe52a133276f49bcdbffa02451f96335)
而这要怎么解决呢?官方给出的解释是用hint_color:
这样,取到的颜色和渲染的就一致了
![](http://tiebapic.baidu.com/forum/w%3D580/sign=443ef6afc262853592e0d229a0ee76f2/9d02c588d43f87947bacc473c51b0ef41ad53ae7.jpg?tbpicau=2024-08-06-05_f99fec7a940199a816ebfe8b5ce2dbc9)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=eabf9643ae389b5038ffe05ab534e5f1/cc89d0fdfc0392450ae66d529094a4c27c1e25e7.jpg?tbpicau=2024-08-06-05_95f7153b45548fe8953d6e46b0bf6099)
而图片在渲染时也会变亮:
![](http://tiebapic.baidu.com/forum/w%3D580/sign=587eb8842e01213fcf334ed464e636f8/de47a9a1cd11728b927e007fdffcc3cec2fd2ce7.jpg?tbpicau=2024-08-06-05_88ddfe4c0786990b5db211f9f40a8276)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=8f898fbc382eb938ec6d7afae56385fe/c7bbd0cec3fdfc03492b6fe5c33f8794a5c226e7.jpg?tbpicau=2024-08-06-05_590a0f2265a3ebeacb080d2bfa1b5077)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=afac6c0f9235e5dd902ca5d746c7a7f5/d9cfc73f8794a4c29d706b7619f41bd5ac6e39e7.jpg?tbpicau=2024-08-06-05_8382ef08e13ee79fbb0e0a668a9db203)
而这又要怎么解决呢?官方给出的解释是用hint_albedo:
![](http://tiebapic.baidu.com/forum/w%3D580/sign=6756223d58c2d562f208d0e5d71090f3/f3448145d688d43f59fa1daf6a1ed21b0ff43be7.jpg?tbpicau=2024-08-06-05_33b7bd50fc3219d48599fdc3dcde147d)
(这里就不做演示了)
但问题来了,如果我不想用hint_color和hint_albedo就想表示正确的颜色怎么办?
(况且像ViewportTexture和CameraTexture这种动态的资源是无法用hint_albedo的)
那就自己转换线性颜色,至于方法,官方color.h源文件中就有这个函数方法(172行处):
![](http://tiebapic.baidu.com/forum/w%3D580/sign=675b5cb0f01190ef01fb92d7fe1a9df7/88d3b7c27d1ed21bec9aa2b8ba6eddc450da3fe7.jpg?tbpicau=2024-08-06-05_185239e7a1be661f8efb463c14c915e7)
我们只需要抄过来改一下格式就行了:
![](http://tiebapic.baidu.com/forum/w%3D580/sign=06b35e7c87ef76c6d0d2fb23ad17fdf6/ab856e1ed21b0ef4f8bb1403cac451da80cb3ee7.jpg?tbpicau=2024-08-06-05_acc99cee33fa6418596bcf3f68c5e241)
这样,即使是ViewportTexture也不会有色差了!
![](http://tiebapic.baidu.com/forum/w%3D580/sign=f95101636cec54e741ec1a1689399bfd/7dcc5410b912c8fc1ba07a90eb039245d78821e7.jpg?tbpicau=2024-08-06-05_0d420d5dd6715ff9305e680d4874866b)
【着色器介绍】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-08-06-05_d5365dd4e8f9e3e5502e758eee3c1601)
着色器代码(将第一个uniform sampler2D加载的图片渲染):
![](http://tiebapic.baidu.com/forum/w%3D580/sign=d787806c363fb80e0cd161df06d02ffb/b5e6de11728b47106f7c7191d4cec3fdfd0323e7.jpg?tbpicau=2024-08-06-05_d33cbb34159d7e04c42b343e9a5089ab)
两个对应的uniform sampler2D:
![](http://tiebapic.baidu.com/forum/w%3D580/sign=340c3c58f2dde711e7d243fe97eecef4/db789494a4c27d1e3375b7990cd5ad6edcc438e7.jpg?tbpicau=2024-08-06-05_e959f194c9b8c42f00771998916e30f2)
但实际上,第一个uniform sampler2D渲染的就是Texture属性加载的图片!!!!:
![](http://tiebapic.baidu.com/forum/w%3D580/sign=6160c28143e736d158138c00ab514ffc/4857aa12c8fcc3ce1a93456e8545d688d53f20e7.jpg?tbpicau=2024-08-06-05_ed4094e794c6fb9669fa73c3efc2e45f)
无论你第一个uniform sampler2D中加载了什么,着色器都会读取Texture属性!!!!!!!
2.在shader_type spatial下的颜色使用线性空间!!!
在shader_type spatial下,如果你直接用vec3来表示颜色,则实际渲染出的颜色会偏亮:
![](http://tiebapic.baidu.com/forum/w%3D580/sign=a182ed8a21d12f2ece05ae687fc3d5ff/b655dbfcc3cec3fd266d2b28c188d43f869427e7.jpg?tbpicau=2024-08-06-05_a49a27ed4a215224345c954c22293333)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=037f298261c6a7efb926a82ecdfbafe9/7259c11b0ef41bd5490064a946da81cb38db3de7.jpg?tbpicau=2024-08-06-05_2cac3ee592f9f6123d91afbe5baf4f40)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=f24000558c504fc2a25fb00dd5dce7f0/ccbaef039245d68809513ef9b3c27d1ed31b24e7.jpg?tbpicau=2024-08-06-05_fe52a133276f49bcdbffa02451f96335)
而这要怎么解决呢?官方给出的解释是用hint_color:
这样,取到的颜色和渲染的就一致了
![](http://tiebapic.baidu.com/forum/w%3D580/sign=443ef6afc262853592e0d229a0ee76f2/9d02c588d43f87947bacc473c51b0ef41ad53ae7.jpg?tbpicau=2024-08-06-05_f99fec7a940199a816ebfe8b5ce2dbc9)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=eabf9643ae389b5038ffe05ab534e5f1/cc89d0fdfc0392450ae66d529094a4c27c1e25e7.jpg?tbpicau=2024-08-06-05_95f7153b45548fe8953d6e46b0bf6099)
而图片在渲染时也会变亮:
![](http://tiebapic.baidu.com/forum/w%3D580/sign=587eb8842e01213fcf334ed464e636f8/de47a9a1cd11728b927e007fdffcc3cec2fd2ce7.jpg?tbpicau=2024-08-06-05_88ddfe4c0786990b5db211f9f40a8276)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=8f898fbc382eb938ec6d7afae56385fe/c7bbd0cec3fdfc03492b6fe5c33f8794a5c226e7.jpg?tbpicau=2024-08-06-05_590a0f2265a3ebeacb080d2bfa1b5077)
![](http://tiebapic.baidu.com/forum/w%3D580/sign=afac6c0f9235e5dd902ca5d746c7a7f5/d9cfc73f8794a4c29d706b7619f41bd5ac6e39e7.jpg?tbpicau=2024-08-06-05_8382ef08e13ee79fbb0e0a668a9db203)
而这又要怎么解决呢?官方给出的解释是用hint_albedo:
![](http://tiebapic.baidu.com/forum/w%3D580/sign=6756223d58c2d562f208d0e5d71090f3/f3448145d688d43f59fa1daf6a1ed21b0ff43be7.jpg?tbpicau=2024-08-06-05_33b7bd50fc3219d48599fdc3dcde147d)
(这里就不做演示了)
但问题来了,如果我不想用hint_color和hint_albedo就想表示正确的颜色怎么办?
(况且像ViewportTexture和CameraTexture这种动态的资源是无法用hint_albedo的)
那就自己转换线性颜色,至于方法,官方color.h源文件中就有这个函数方法(172行处):
![](http://tiebapic.baidu.com/forum/w%3D580/sign=675b5cb0f01190ef01fb92d7fe1a9df7/88d3b7c27d1ed21bec9aa2b8ba6eddc450da3fe7.jpg?tbpicau=2024-08-06-05_185239e7a1be661f8efb463c14c915e7)
我们只需要抄过来改一下格式就行了:
![](http://tiebapic.baidu.com/forum/w%3D580/sign=06b35e7c87ef76c6d0d2fb23ad17fdf6/ab856e1ed21b0ef4f8bb1403cac451da80cb3ee7.jpg?tbpicau=2024-08-06-05_acc99cee33fa6418596bcf3f68c5e241)
这样,即使是ViewportTexture也不会有色差了!
![](http://tiebapic.baidu.com/forum/w%3D580/sign=f95101636cec54e741ec1a1689399bfd/7dcc5410b912c8fc1ba07a90eb039245d78821e7.jpg?tbpicau=2024-08-06-05_0d420d5dd6715ff9305e680d4874866b)