Glsl 如何在反照率上传递着色器颜色

Glsl 如何在反照率上传递着色器颜色,glsl,shader,godot,Glsl,Shader,Godot,反照率为vec3,颜色为vec4。。我需要把颜色传递给戈多的反照率。。此着色器适用于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.x

反照率为vec3,颜色为vec4。。我需要把颜色传递给戈多的反照率。。此着色器适用于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?

}

对于α和反照率:
反照率=a.xyz是正确的。对于
a.w
,通常您会这样做:
ALPHA=a.w。但是,在这种情况下,
a.w
似乎总是1。所以没有意义

我将选择代码的其余部分。请记住,我不知道它应该是什么样子,也不知道
采样器2D
的纹理(我猜是噪波纹理,无缝)


检查渲染模式。来自ShaderToy,您可能希望
渲染模式不着色,这将使灯光不影响材质。看


为便于使用,您可以使用提示。特别是,按如下方式书写色调:

uniform vec4 tint_color: hint_color = vec4(0.0, 0.5,0.99, 1);
vec2 i_resolution = 1.0/SCREEN_PIXEL_SIZE;
vec2 uv = FRAGCOORD.xy/i_resolution;
所以Godot在着色器参数中为您提供了一个颜色选择器。看

您还可以对
amp
使用
hint\u范围(0,1)
。然而,我对此并不确定


仔细检查你的坐标。我怀疑这是
FRAGCOORD.xy/(1.0/视口大小)。xy
应该是
SCREEN\u UV
(或者
UV
,如果它应该与具有材质的对象保持在一起)

原作是这样的:

uniform vec4 tint_color: hint_color = vec4(0.0, 0.5,0.99, 1);
vec2 i_resolution = 1.0/SCREEN_PIXEL_SIZE;
vec2 uv = FRAGCOORD.xy/i_resolution;
正如我在中所说,
1.0/SCREEN\u PIXEL\u SIZE
VIEWPORT\u SIZE
。替换它。我们有:

vec2 i_resolution = VIEWPORT_SIZE;
vec2 uv = FRAGCOORD.xy/i_resolution;
vec2 uv = SCREEN_UV;
内联:

vec2 uv = FRAGCOORD.xy/VIEWPORT_SIZE;
正如我在前面的回答中所说,
FRAGCOORD.xy/VIEWPORT\u SIZE
SCREEN\u UV
(或者
UV
,如果您不希望材质依赖于屏幕上的位置)。替换它。我们有:

vec2 i_resolution = VIEWPORT_SIZE;
vec2 uv = FRAGCOORD.xy/i_resolution;
vec2 uv = SCREEN_UV;
即使这不是您想要的,它也是测试的好方法


试着移动相机。这就是你想要的吗?不尝试
vec2uv=uv取而代之。事实上,一个变量在这一点上是很难证明的。

谢谢,你说得对!我的问题是摄像头‘vec2 uv=-SCREEN_uv;’的位置@我没想到你会需要它。然而,我测试了,我可以确认,这将显示一个纹理在正确的方向。Godot似乎也没有颠倒屏幕坐标(虽然不是ShaderToy使用的确切坐标,但对此进行更正也不适用于此着色器)。它似乎是取样器坐标。@Rubénramirez在性能上,它是用于移动的吗?切换到GLES2肯定会有帮助,降低游戏的分辨率也会有帮助(请参阅)。我并不是说这就是你能做的一切,但我不知道你还能做什么。@Rubénramirez在shadertoy中试试这个:
void main image(out vec4 fragColor,in vec2 fragCoord){vec2 uv=fragCoord/iResolution.xy;fragColor=vec4(uv.x,uv.y,0,1.0)}
试试这个是Godot:
shader\u类型的空间;渲染_模式未着色;void fragment(){vec2 uv=SCREEN_uv;ALBEDO=vec3(uv.x,uv.y,0.0);}
您应该会看到相同的结果(左下角为黑色,左上角为绿色,右上角为黄色,右下角为红色)。所以,坐标的方向是相同的。然而,似乎采样器坐标可能不确定,不确定它是在导入时还是在
纹理
功能中。@Rubénramirez我提醒您
屏幕(UV
占据整个屏幕。使物体变大,并定位摄像机,使其覆盖整个屏幕。如果要将其绑定到对象,请使用
UV