ALBEDO 是 vec3,COLOR 是 vec4。我需要将 COLOR 传递给 Godot 上的 ALBEDO。该着色器适用于着色器类型 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;
正如我在 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
(如果您不想要 Material ,则为 UV
)取决于屏幕上的位置)。代替它。我们有:
vec2 uv = SCREEN_UV;
即使这不是您想要的,它也有利于测试。
尝试移动相机。那是你要的吗?不?尝试使用 vec2 uv = UV;
代替。 事实上,此时很难证明变量的合理性。
关于glsl - 如何在 ALBEDO 上传递着色器颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67223897/