【问题标题】:how to pass shader COLOR on ALBEDO如何在 ALBEDO 上传递着色器颜色
【发布时间】:2021-07-17 07:18:03
【问题描述】:

ALBEDO 是 vec3,COLOR 是 vec4.. 我需要在 Godot 上将 COLOR 传递给 ALBEDO.. 此着色器适用于着色器类型 itemcanvas,但不适用于空间材质..

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?

}

【问题讨论】:

    标签: glsl shader godot


    【解决方案1】:

    对于 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;事实上,此时很难证明一个变量是正确的。

    【讨论】:

    • 谢谢,你是对的!我的问题是相机'vec2 uv = -SCREEN_UV;'的位置
    • @Rubénramirez 我没想到你会需要它。但是,我进行了测试,并且可以确认这会以正确的方向显示纹理。 Godot 似乎也没有颠倒屏幕坐标(尽管不完全是 ShaderToy 使用的,see,对此进行更正也不适用于此着色器)。它似乎是采样器坐标。
    • @Rubénramirez 关于性能,它适用于移动设备吗?切换到 GLES2 和降低游戏分辨率肯定会有所帮助(请参阅 Multiple resolutions)。我并不是说你能做的就是这些,但我不知道你还能做什么。
    • @Rubénramirez 在 shadertoy 中试试这个:void mainImage( out vec4 fragColor, in vec2 fragCoord){vec2 uv = fragCoord/iResolution.xy; fragColor = vec4(uv.x,uv.y,0.0,1.0);} 试试这个是 Godot:shader_type spatial; render_mode unshaded; void fragment () {vec2 uv = SCREEN_UV; ALBEDO = vec3(uv.x,uv.y,0.0);} 你应该会看到相同的结果(左下角是黑色,左上角是绿色,顶部是黄色右下角的红色)。因此,坐标的方向是相同的。但是,似乎采样器坐标可能不是,不确定是在导入时还是 texture 函数。
    • @Rubénramirez 我提醒你SCREEN_UV 占据整个屏幕。使对象更大并定位相机,使其覆盖整个屏幕。如果您想将其绑定到对象,请使用UV
    猜你喜欢
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    相关资源
    最近更新 更多