效果
代码
顶点着色器:
#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);
}
注意事项
- 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)坐标是这个图像的中心,而不是左上角。
- 这里我将整个窗口作为绘制区域,因此需要确保VAO绑定的顶点能够绘制整个窗口