问题描述
ALbedO 是 vec3 而 COLOR 是 vec4.. 我需要将 COLOR 传递给 Godot 上的 ALbedO.. 这个着色器适用于 shadertype itemscanvas 但不适用于空间材料..
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;
,这将使灯光不影响材质。见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
,如果它应该留在有材料的物体上) .
原来是这样的:
vec2 i_resolution = 1.0/SCREEN_PIXEL_SIZE;
vec2 uv = FRAGCOORD.xy/i_resolution;
正如我在 prior answer 中所说,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
(如果您不希望材料依赖于屏幕上的位置,则为 UV
)。代替它。我们有:
vec2 uv = SCREEN_UV;
即使这不是您想要的,也可以用于测试。
尝试移动相机。那是你要的吗?不?改为尝试 vec2 uv = UV;
。 事实上,在这一点上很难证明一个变量是合理的。