如何在 ALBEDO 上传递着色器 COLOR
how to pass shader COLOR on ALBEDO
ALBEDO 是 vec3,COLOR 是 vec4。我需要在 Godot 上将 COLOR 传递给 ALBEDO。这个着色器适用于 shadertype itemscanvas 但不适用于空间 material..
shader_type spatial;
uniform float amp = 0.1;
uniform vec4 tint_color = vec4(0.0, 0.5,0.99, 1);
uniform sampler2D iChannel0;
void fragment ()
{
vec2 uv = FRAGCOORD.xy / (1.0/VIEWPORT_SIZE).xy;// (1.0/SCREEN_PIXEL_SIZE) for shader_type canvas_item
vec2 p = uv +
(vec2(.5)-texture(iChannel0, uv*0.3+vec2(TIME*0.05, TIME*0.025)).xy)*amp +
(vec2(.5)-texture(iChannel0, uv*0.3-vec2(-TIME*0.005, TIME*0.0125)).xy)*amp;
vec4 a = texture(iChannel0, p)*tint_color;
ALBEDO = a.xyz; //the w channel is not important, works without it on shader_type canvas_item but if used this on 3d spatial the effect no pass.. whats problem?
}
对于 ALPHA 和 ALBEDO: ALBEDO = a.xyz;
是正确的。对于 a.w
,通常你会这样做:ALPHA = a.w;
。但是,在这种情况下,a.w
似乎始终为 1。因此没有意义。
我会挑选其余的代码。 请记住,我不知道它应该是什么样子,也不知道 sampler2D
的纹理(我猜是噪声纹理,无缝)。
检查你的渲染模式。来自ShaderToy,有可能你想要render_mode unshaded;
,这将使灯光不影响material。参见 Render Modes。
为了便于使用,您可以使用提示。特别是,像这样写色调颜色:
uniform vec4 tint_color: hint_color = vec4(0.0, 0.5,0.99, 1);
所以 Godot 在着色器参数中给了你一个颜色选择器。参见 Uniforms。
您也可以将 hint_range(0, 1)
用于 amp
。但是,我不确定。
仔细检查你的坐标。我怀疑这个 FRAGCOORD.xy / (1.0/VIEWPORT_SIZE).xy
应该是 SCREEN_UV
(或者 UV
,如果它应该和对象一起有 material).
原来是这样的:
vec2 i_resolution = 1.0/SCREEN_PIXEL_SIZE;
vec2 uv = FRAGCOORD.xy/i_resolution;
正如我在 中所说,1.0 / SCREEN_PIXEL_SIZE
是 VIEWPORT_SIZE
。代替它。我们有:
vec2 i_resolution = VIEWPORT_SIZE;
vec2 uv = FRAGCOORD.xy/i_resolution;
内联:
vec2 uv = FRAGCOORD.xy/VIEWPORT_SIZE;
正如我在之前的回答中所说,FRAGCOORD.xy/VIEWPORT_SIZE
是 SCREEN_UV
(如果您不希望 material 取决于屏幕上的位置,则 UV
).代替它。我们有:
vec2 uv = SCREEN_UV;
即使那不是你想要的,也可以用来测试
尝试移动相机。那是你要的吗?不?请尝试 vec2 uv = UV;
。 事实上,一个变量在那个时候是很难证明的。
ALBEDO 是 vec3,COLOR 是 vec4。我需要在 Godot 上将 COLOR 传递给 ALBEDO。这个着色器适用于 shadertype itemscanvas 但不适用于空间 material..
shader_type spatial;
uniform float amp = 0.1;
uniform vec4 tint_color = vec4(0.0, 0.5,0.99, 1);
uniform sampler2D iChannel0;
void fragment ()
{
vec2 uv = FRAGCOORD.xy / (1.0/VIEWPORT_SIZE).xy;// (1.0/SCREEN_PIXEL_SIZE) for shader_type canvas_item
vec2 p = uv +
(vec2(.5)-texture(iChannel0, uv*0.3+vec2(TIME*0.05, TIME*0.025)).xy)*amp +
(vec2(.5)-texture(iChannel0, uv*0.3-vec2(-TIME*0.005, TIME*0.0125)).xy)*amp;
vec4 a = texture(iChannel0, p)*tint_color;
ALBEDO = a.xyz; //the w channel is not important, works without it on shader_type canvas_item but if used this on 3d spatial the effect no pass.. whats problem?
}
对于 ALPHA 和 ALBEDO: ALBEDO = a.xyz;
是正确的。对于 a.w
,通常你会这样做:ALPHA = a.w;
。但是,在这种情况下,a.w
似乎始终为 1。因此没有意义。
我会挑选其余的代码。 请记住,我不知道它应该是什么样子,也不知道 sampler2D
的纹理(我猜是噪声纹理,无缝)。
检查你的渲染模式。来自ShaderToy,有可能你想要render_mode unshaded;
,这将使灯光不影响material。参见 Render Modes。
为了便于使用,您可以使用提示。特别是,像这样写色调颜色:
uniform vec4 tint_color: hint_color = vec4(0.0, 0.5,0.99, 1);
所以 Godot 在着色器参数中给了你一个颜色选择器。参见 Uniforms。
您也可以将 hint_range(0, 1)
用于 amp
。但是,我不确定。
仔细检查你的坐标。我怀疑这个 FRAGCOORD.xy / (1.0/VIEWPORT_SIZE).xy
应该是 SCREEN_UV
(或者 UV
,如果它应该和对象一起有 material).
原来是这样的:
vec2 i_resolution = 1.0/SCREEN_PIXEL_SIZE;
vec2 uv = FRAGCOORD.xy/i_resolution;
正如我在 1.0 / SCREEN_PIXEL_SIZE
是 VIEWPORT_SIZE
。代替它。我们有:
vec2 i_resolution = VIEWPORT_SIZE;
vec2 uv = FRAGCOORD.xy/i_resolution;
内联:
vec2 uv = FRAGCOORD.xy/VIEWPORT_SIZE;
正如我在之前的回答中所说,FRAGCOORD.xy/VIEWPORT_SIZE
是 SCREEN_UV
(如果您不希望 material 取决于屏幕上的位置,则 UV
).代替它。我们有:
vec2 uv = SCREEN_UV;
即使那不是你想要的,也可以用来测试
尝试移动相机。那是你要的吗?不?请尝试 vec2 uv = UV;
。 事实上,一个变量在那个时候是很难证明的。