用GLSL实现的简单分形图

效果

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

代码

顶点着色器:

#version 330
layout (location = 0) in vec3 aPos;   // 位置变量的属性位置值为 0 

void main()
{
		 gl_Position = vec4(aPos,1);
}

片段着色器:

#version 330
#define SCR_WIDTH 900
#define SCR_HEIGHT 900

out vec4 FragColor;  
uniform float time;
//uniform int piece;		// 块数

vec2 tail(vec2 st,int piece){	// piece:要切割的块数
	return fract(piece*st);
}

void wave(vec2 st,int mul){
	if((mod(floor(st.x*mul),2)==0&&mod(floor(st.y*mul),2)==0)||(mod(floor(st.x*mul),2)==1&&mod(floor(st.y*mul),2)==1))
    FragColor = normalize(vec4(0.5,0,0.5, 1.0)+vec4(vec3(sin(time)/3),0));
	else
	FragColor = vec4(0,1,0.2,0);
}

void crossroad(vec2 st){
	if(st.x>0.5)
		FragColor = vec4(0.5,0,0.5,1);
	if(st.y>0.5)
		FragColor = vec4(0,0.9,0.5,1);
	if(st.x>0.5&&st.y>0.5)
		FragColor = vec4(0.5,0,0.5,1)+(0,0.9,0.5,1);
}

void main()
{
	vec2 resolution = vec2(SCR_WIDTH,SCR_HEIGHT);
	vec2 normalized = gl_FragCoord.xy/resolution.xy;
	vec2 st = tail(normalized,30);
	wave(st,5);
	//wave(st,2);
	//crossroad(st);
}


注意事项

  1. gl_FragCoord采用(x,y,z,1/w)的屏幕相对坐标,而非标准化设备坐标。以左下角为(0,0),右下角为(WIDTH,0),左上角为(0,HEIGHT)。

标准化设备坐标(Normalized Device Coordinates, NDC)
一旦你的顶点坐标已经在顶点着色器中处理过,它们就应该是标准化设备坐标了,标准化设备坐标是一个x、y和z值在-1.0到1.0的一小段空间。任何落在范围外的坐标都会被丢弃/裁剪,不会显示在你的屏幕上。与通常的屏幕坐标不同,y轴正方向为向上,(0, 0)坐标是这个图像的中心,而不是左上角。

  1. 这里我将整个窗口作为绘制区域,因此需要确保VAO绑定的顶点能够绘制整个窗口
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值