微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 ALBEDO 上传递着色器颜色

如何解决如何在 ALBEDO 上传递着色器颜色

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_SIZEVIEWPORT_SIZE。代替它。我们有:

vec2 i_resolution = VIEWPORT_SIZE;
vec2 uv = FRAGCOORD.xy/i_resolution;

内联:

vec2 uv = FRAGCOORD.xy/VIEWPORT_SIZE;

正如我在之前的回答中所说,FRAGCOORD.xy/VIEWPORT_SIZESCREEN_UV(如果您不希望材料依赖于屏幕上的位置,则为 UV)。代替它。我们有:

vec2 uv = SCREEN_UV;

即使这不是您想要的,也可以用于测试。

尝试移动相机。那是你要的吗?不?改为尝试 vec2 uv = UV;事实上,在这一点上很难证明一个变量是合理的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。