由shadertoy glsl到houdini vex——小记

发布于:2022-10-29 ⋅ 阅读:(813) ⋅ 点赞:(0)

最近在学习ue和unity的shader,看到 B站Emoter_森羅的shader教程
讲解的是原作品 Cyber Fuji 2020 (赛博富士2020) created by: kaiware007
我就想着到houdini里也做一遍,发现怎么做都不一样,shader也没法很直接的调试,只能注释着排除,直接说结论:houdini的vex函数smooth与glsl的smoothstep其实并不完全一样。


测试步骤

houdini测试uv

vector2 resolution = set(chi("../grid1/sizex"),chi("../grid1/sizey"));
vector2 fragcoord = set(@primnum%resolution.x,int(resolution.y-@primnum/resolution.x));
float Time = @Time;
vector4 fragColor;
/*actually work*/
vector2 uv = (2.0 * fragcoord - resolution)/min(resolution.x,resolution.y);
vector col = set(uv.x,uv.y,0);
/*actually work*/
fragColor = col;
setprimattrib(0,"Cd", @primnum,fragColor);

houdini测试uv截图

shadertoy测试uv

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    vec2 uv = (2.0 * fragCoord.xy - iResolution.xy)/min(iResolution.x,iResolution.y);
    vec3 col = vec3(uv, 0.0);
    fragColor = vec4(col,1.0);
}

shadertoy测试uv截图

可知基础环境应该是没有问题的

houdini测试smooth

注意smooth中前两个参数为0.3,0.29
由于只是把1里的smooth这一行改一下,其他内容不变,就不写上来了

vector2 resolution = set(chi("../grid1/sizex"),chi("../grid1/sizey"));
vector2 fragcoord = set(@primnum%resolution.x,int(resolution.y-@primnum/resolution.x));
float Time = @Time;
vector4 fragColor;
/*actually work*/
vector2 uv = (2.0 * fragcoord - resolution)/min(resolution.x,resolution.y);
float val = smooth(3, 029, length(uv));
vector col = set(val,0,0);
/*actually work*/
fragColor = col;
setprimattrib(0,"Cd", @primnum,fragColor);

houdini测试smooth2

shadertoy测试smoothstep 2

注意smoothstep中前两个参数为0.3,0.29
由于只是把1里的smoothstep这一行改一下,其他内容不变,就不写上来了

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    vec2 uv = (2.0 * fragCoord.xy - iResolution.xy)/min(iResolution.x,iResolution.y);
    float val = smoothstep(0.3, 0.29, length(uv));
    vec3 col = vec3(val, 0.0, 0.0);
    fragColor = vec4(col,1.0);
}

shadertoy测试smoothseto2
到这里才发现两者不同,也就是,只有前参数大于后参数时,才产生区别。

解决办法

解决办法当然是传统艺能,重写一个smooth了。直接在vex中自定义一个function也可以,例如

function float shader_vex_smoothstep(float edge0;float edge1;float x)
{
    float t = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);
    return t * t * (3.0 - 2.0 * t);
}

但我还是选择在HDK中实现,使用template可以方便以后的扩展。目前不需要,就不做了。

关于Houdini HDK的内容可能会在后续文章中讲解。HDK制作SOP与VEX是比较常见的。目前已经写了几篇了,是b站视频中HDK内容的 ! 业余 ! 分析,视频内容本身也很业余,以整活和useless为主,所以我也只能业余分析。 问:为什么不直接录视频顺便讲了呢?答:因为我不知道说啥,容易说的很乱

最终效果

shadertoy效果

请添加图片描述

houdini效果

请添加图片描述
又水了一篇useless文章


网站公告

今日签到

点亮在社区的每一天
去签到