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

标签 glsl shader godot

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

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

内联:

vec2 uv = FRAGCOORD.xy/VIEWPORT_SIZE;

正如我在之前的回答中所说,FRAGCOORD.xy/VIEWPORT_SIZESCREEN_UV(如果您不想要 Material ,则为 UV)取决于屏幕上的位置)。代替它。我们有:

vec2 uv = SCREEN_UV;

即使这不是您想要的,它也有利于测试。

尝试移动相机。那是你要的吗?不?尝试使用 vec2 uv = UV; 代替。 事实上,此时很难证明变量的合理性。

关于glsl - 如何在 ALBEDO 上传递着色器颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67223897/

相关文章:

three.js - 三JS : Get useful shader build log

c# - Monodevelop 不会运行任何项目

java - 将属性传递到着色器 Libgdx

opengl - 多维工作组中的 gl_SubgroupInitationID 计数

glsl - iResolution 在着色器中意味着什么?

scroll - 如何在Godot中实现触摸滚动

Godot - 如何为我的库存添加工具提示?

c++ - 使用 FBO 的片段着色器的多个输出

c++ - OpenGL 程序着色器链接错误

java - 顶点着色器可以用于翻页效果吗?