ShaderToy(三)画矩形

4 篇文章 0 订阅

首先将上节的绘制笑脸整合为函数Smiley(uv, p, size):p为笑脸中心位置,size为笑脸尺度。

float Circle(vec2 uv, vec2 p, float r, float blur)
{
    float d = length(uv - p);
    float c = smoothstep(r, r-blur, d);
    
    return c;
}

float Smiley(vec2 uv, vec2 p, float size)
{
    uv -= p;
    uv /= size;
    float c = Circle(uv, vec2(0.0), 0.4, 0.05);

    c -= Circle(uv, vec2(-0.13, 0.2), 0.07, 0.01);
    c -= Circle(uv, vec2(0.13, 0.2), 0.07, 0.01);
    
    float mouth = Circle(uv, vec2(0.0, 0.0), 0.3, 0.02);
    mouth -= Circle(uv, vec2(0.0, 0.1), 0.3, 0.02);
    mouth = (mouth == 1.0)? 1.0 : 0.0;
    c -= mouth;
    
    return c;
}

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    // Normalized pixel coordinates (from 0 to 1)
    vec2 uv = fragCoord/iResolution.xy;
     
    uv -= 0.5;
    uv.x *= iResolution.x / iResolution.y;
    
    float mask = Smiley(uv, vec2(0.3, 0.3), 1.25);
    vec3 col = vec3(0.0);
    col = vec3(1.0, 1.0, 0.0) * mask; // yellow

    // Output to screen
    fragColor = vec4(col,1.0);
}

接下来我们使用平滑阶梯smoothstep()函数绘制矩形

首先可以绘制边界:可以看做边界x值为-0.15,blur为0.05;

c = smoothstep(-0.2, -0.1, uv.x);

绘制右边白转黑边界:可以看做边界x值为0.15,blur为0.05;

c = smoothstep(0.2, 0.1, uv.x);

 

 我们可以编写边界Band函数:使用乘法来取相交的白色部分

float Band(float t, float start, float end, float blur)
{
	float step1 = smoothstep(start-blur, start+blur, t);
	float step2 = smoothstep(end+blur, end-blur, t);
	return step1 * step2;
}

c = Band(uv.x, -0.2, 0.2, 0.01);

 由此,我们可以扩展得到我们绘制矩阵的函数:

float Rect(vec2 uv, float left, float right, float bottom, float top, float blur)
{
	float band1 = Band(uv.x, left, right, blur);
	float band2 = Band(uv.y, bottom, top, blur);
	return band1 * band2;
}

c = Rect(uv, -0.5, 0.4, -0.3, 0.2, 0.01);

整体代码:

float Band(float t, float start, float end, float blur)
{
	float step1 = smoothstep(start-blur, start+blur, t);
	float step2 = smoothstep(end+blur, end-blur, t);
	return step1 * step2;
}

float Rect(vec2 uv, float left, float right, float bottom, float top, float blur)
{
	float band1 = Band(uv.x, left, right, blur);
	float band2 = Band(uv.y, bottom, top, blur);
	return band1 * band2;
}


void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    // Normalized pixel coordinates (from 0 to 1)
    vec2 uv = fragCoord/iResolution.xy;
    uv -= 0.5;
    uv.x *= iResolution.x / iResolution.y;

    float c = 0.0;
    c = Rect(uv, -0.5, 0.4, -0.3, 0.2, 0.01);
    
    vec3 col = vec3(0.0);
    col = vec3(1.0, 1.0, 1.0) * c;
    // Output to screen
    fragColor = vec4(col,1.0);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在MATLAB中,可以使用surf函数来绘制矩形。首先,需要定义矩形的四个顶点的坐标,然后使用surf函数将这些点连接起来形成矩形的表面。以下是一个示例代码: ```matlab x = \[1 1 5 5\]; % 矩形的x坐标 y = \[2 5 5 2\]; % 矩形的y坐标 z = \[0 0 0 0\]; % 矩形的z坐标,这里设为0表示矩形在z=0的平面上 surf(\[x;x\],\[y;y\],\[z;z\],'FaceColor','red','EdgeColor','black'); % 绘制矩形的表面 axis equal; % 设置坐标轴比例一致,使矩形不会被拉伸变形 ``` 这段代码会在维坐标系中绘制一个红色的矩形。\[2\]请注意,这里使用了surf函数而不是plot函数,因为plot函数只能绘制二维曲线。 #### 引用[.reference_title] - *1* *3* [【matlab】维曲面(矩形网格---meshgrid)](https://blog.csdn.net/weixin_45592298/article/details/106008468)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [matlab 一个矩形](https://blog.csdn.net/zhanghanqmx/article/details/119455336)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值