├── 01_KeyFrame └── commonTex.vert ├── 02_TreeTrunk └── commonTexTree.vert ├── 03_Fluctuation └── commonTexX.vert ├── 04_Spin └── commonTex.vert ├── 05_Distortion └── commonTex.vert ├── 06_Swell └── commonTex.vert ├── 07_Brick └── commonTexLight.frag ├── 08_ImageProcessing ├── EdgeDetection.frag ├── Emboss.frag ├── GaussianBlur.frag ├── MeanBlur.frag ├── Sharpen.frag └── SmoothFilter.frag ├── 10_VolumetricFog └── commonTexLand.frag ├── README.md └── result ├── r1.gif ├── r10.gif ├── r2.gif ├── r3.gif ├── r4.gif ├── r5.gif ├── r6.gif ├── r9.gif ├── shu1.png ├── shu2.png └── zhuan.png /01_KeyFrame/commonTex.vert: -------------------------------------------------------------------------------- 1 | #version 400 2 | #extension GL_ARB_separate_shader_objects : enable 3 | #extension GL_ARB_shading_language_420pack : enable 4 | layout (push_constant) uniform constantVals { 5 | mat4 mvp; 6 | } myConstantVals; 7 | layout (std140,set = 0, binding = 0) uniform bufferVals { 8 | float uBfb; 9 | } myBufferVals; 10 | layout (location = 0) in vec3 aPosition; 11 | layout (location = 1) in vec3 bPosition; 12 | layout (location = 2) in vec3 cPosition; 13 | layout (location = 3) in vec2 inTexCoor; 14 | 15 | layout (location = 0) out vec2 outTexCoor; 16 | out gl_PerVertex { 17 | vec4 gl_Position; 18 | }; 19 | void main() { 20 | vec3 tPosition;//融合后的结果顶点 21 | if(myBufferVals.uBfb<=1.0)//若融合比例小于等于1,则需要执行的是1、2号关键帧的融合 22 | { 23 | tPosition=mix(aPosition,bPosition,myBufferVals.uBfb); 24 | }else//若融合比例大于1,则需要执行的是2、3号关键帧的融合 25 | { 26 | tPosition=mix(bPosition,cPosition,myBufferVals.uBfb-1.0); 27 | } 28 | outTexCoor = inTexCoor; 29 | gl_Position = myConstantVals.mvp * vec4(tPosition,1.0); 30 | } 31 | -------------------------------------------------------------------------------- /02_TreeTrunk/commonTexTree.vert: -------------------------------------------------------------------------------- 1 | #version 400 2 | #extension GL_ARB_separate_shader_objects : enable 3 | #extension GL_ARB_shading_language_420pack : enable 4 | layout (push_constant) uniform constantVals { 5 | mat4 mvp; 6 | } myConstantVals; 7 | layout (std140,set = 0, binding =0 ) uniform bufferVals {//输入的一致块 8 | float bend_R;//弯曲半径 9 | float direction_degree;//风的方向 10 | } myBufferVals; 11 | layout (location = 0) in vec3 pos;//输入的物体坐标系顶点位置 12 | layout (location = 1) in vec2 inTexCoor;//输入的纹理坐标 13 | layout (location = 0) out vec2 outTexCoor;//输出到片元着色器的纹理坐标 14 | out gl_PerVertex { 15 | vec4 gl_Position; 16 | }; 17 | void main() { 18 | float current_radian=pos.y/myBufferVals.bend_R;//计算当前的弧度(θ) 19 | float pianDistance=myBufferVals.bend_R-myBufferVals.bend_R*cos(current_radian);//计算偏移距离(OD) 20 | float result_X=pos.x+pianDistance*sin(radians(myBufferVals.direction_degree));//计算偏移后的X距离 21 | float result_Y=myBufferVals.bend_R*sin(current_radian);//计算偏移后的Y距离 22 | float result_Z=pos.z+pianDistance*cos(radians(myBufferVals.direction_degree));//计算偏移后的Z距离 23 | vec4 tPostion=vec4(result_X,result_Y,result_Z,1.0);//得到最后的坐标 24 | outTexCoor = inTexCoor; 25 | gl_Position = myConstantVals.mvp * tPostion; 26 | } 27 | -------------------------------------------------------------------------------- /03_Fluctuation/commonTexX.vert: -------------------------------------------------------------------------------- 1 | #version 400 2 | #extension GL_ARB_separate_shader_objects : enable 3 | #extension GL_ARB_shading_language_420pack : enable 4 | layout (push_constant) uniform constantVals { 5 | mat4 mvp; 6 | } myConstantVals; 7 | layout (std140,set = 0, binding =0 ) uniform bufferVals {//输入的一致块 8 | float uWidthSpan;//横向长度总跨度 9 | float uStartAngle;//起始角度 10 | } myBufferVals; 11 | layout (location = 0) in vec3 pos;//传入的物体坐标系顶点位置 12 | layout (location = 1) in vec2 inTexCoor;//传入的纹理坐标 13 | layout (location = 0) out vec2 outTexCoor;//传到片元着色器的顶点位置 14 | out gl_PerVertex { 15 | vec4 gl_Position; 16 | }; 17 | void main() { 18 | float angleSpanH=4.0*3.14159265;//横向角度总跨度,用于进行X距离与角度的换算 19 | float startX=-myBufferVals.uWidthSpan/2.0;//起始X坐标(即最左侧顶点的X坐标) 20 | float currAngle=myBufferVals.uStartAngle+((pos.x-startX)/myBufferVals.uWidthSpan)*angleSpanH; 21 | float tz=sin(currAngle)*0.5;//通过正弦函数求出当前点的Z坐标 22 | outTexCoor = inTexCoor; 23 | gl_Position = myConstantVals.mvp * vec4(pos.x,pos.y,tz,1.0);//计算顶点最终位置 24 | } 25 | -------------------------------------------------------------------------------- /04_Spin/commonTex.vert: -------------------------------------------------------------------------------- 1 | #version 400 2 | #extension GL_ARB_separate_shader_objects : enable 3 | #extension GL_ARB_shading_language_420pack : enable 4 | layout (push_constant) uniform constantVals { 5 | mat4 mvp; 6 | } myConstantVals; 7 | layout (std140,set = 0, binding =0 ) uniform bufferVals {//输入的一致块 8 | float angleSpan;//本帧扭曲总角度 9 | float yStart;//Y坐标起始点 10 | float ySpan;//Y坐标总跨度 11 | } myBufferVals; 12 | layout (location = 0) in vec3 pos;//输入的物体坐标系顶点位置 13 | layout (location = 1) in vec2 inTexCoor;//输入的纹理坐标 14 | layout (location = 0) out vec2 outTexCoor;//输出到片元着色器的纹理坐标 15 | out gl_PerVertex { 16 | vec4 gl_Position; 17 | }; 18 | void main() { 19 | float currAngle= myBufferVals.angleSpan*(pos.y-myBufferVals.yStart)/myBufferVals.ySpan;//计算当前顶点扭动(绕中心点选择)的角度 20 | vec3 tPosition=pos; 21 | if(pos.y>myBufferVals.yStart){//若不是最下面一层的顶点则计算扭动后的X、Z坐标 22 | tPosition.x=(cos(currAngle)*pos.x-sin(currAngle)*pos.z); 23 | tPosition.z=(sin(currAngle)*pos.x+cos(currAngle)*pos.z); 24 | } 25 | outTexCoor = inTexCoor; 26 | gl_Position = myConstantVals.mvp * vec4(tPosition,1.0); 27 | } 28 | -------------------------------------------------------------------------------- /05_Distortion/commonTex.vert: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/douysu/shader/48896e432febc7ff7d05ff645724c4f6747b1dc1/05_Distortion/commonTex.vert -------------------------------------------------------------------------------- /06_Swell/commonTex.vert: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/douysu/shader/48896e432febc7ff7d05ff645724c4f6747b1dc1/06_Swell/commonTex.vert -------------------------------------------------------------------------------- /07_Brick/commonTexLight.frag: -------------------------------------------------------------------------------- 1 | #version 400 2 | #extension GL_ARB_separate_shader_objects : enable//开启separate_shader_objects 3 | #extension GL_ARB_shading_language_420pack : enable//开启shading_language_420pack 4 | layout (location = 0) in vec3 vposition;//顶点着色器传入的顶点位置 5 | layout (location = 1) in vec2 mcLongLat;//顶点着色器传入的顶点位置(偏航角,仰角) 6 | layout (location = 0) out vec4 outColor;//输出到渲染管线的片元颜色值 7 | void main(){//主方法 8 | vec3 bColor=vec3(0.678,0.231,0.129);//砖块的颜色 9 | vec3 mColor=vec3(0.763,0.657,0.614);//水泥的颜色 10 | vec3 color;//片元的最终颜色 11 | //计算当前位于奇数还是偶数行 12 | int row=int(mod((mcLongLat.y+90.0)/12.0,2.0)); 13 | //计算当前片元是否在此行区域1中的辅助变量 14 | float ny=mod(mcLongLat.y+90.0,12.0); 15 | //每行的砖块偏移值,奇数行偏移半个砖块 16 | float oeoffset=0.0; 17 | //当前片元是否在此行区域3中的辅助变量 18 | float nx; 19 | if(ny>10.0){//位于此行的区域1中 20 | color=mColor;//采用水泥色着色 21 | }else{//不位于此行的区域1中 22 | if(row==1){//若为奇数行则偏移半个砖块 23 | oeoffset=11.0; 24 | } 25 | //计算当前片元是否在此行区域3中的辅助变量 26 | nx=mod(mcLongLat.x+oeoffset,22.0); 27 | if(nx>20.0){//不位于此行的区域3中 28 | color=mColor; 29 | }else{//位于此行的区域3中 30 | color=bColor;//采用砖块色着色 31 | } 32 | } //将片元的最终颜色传递进渲染管线 33 | outColor=vec4(color,0); 34 | } 35 | -------------------------------------------------------------------------------- /08_ImageProcessing/EdgeDetection.frag: -------------------------------------------------------------------------------- 1 | #version 400 2 | #extension GL_ARB_separate_shader_objects : enable 3 | #extension GL_ARB_shading_language_420pack : enable 4 | layout (binding = 1) uniform sampler2D sTexture; 5 | layout (location = 0) in vec2 vTextureCoord; 6 | layout (location = 0) out vec4 outColor; 7 | void main() { 8 | //纹理偏移量单位步进 9 | const float stStep = 512.0; 10 | const float scaleFactor = 1.0;//给出最终求和时的加权因子(为调整亮度) 11 | //给出卷积内核中各个元素对应像素相对于待处理像素的纹理坐标偏移量 12 | vec2 offsets[9]=vec2[9]( 13 | vec2(-1.0,-1.0),vec2(0.0,-1.0),vec2(1.0,-1.0), 14 | vec2(-1.0,0.0),vec2(0.0,0.0),vec2(1.0,0.0), 15 | vec2(-1.0,1.0),vec2(0.0,1.0),vec2(1.0,1.0) 16 | ); 17 | //卷积内核中各个位置的值 18 | float kernelValues[9]=float[9] ( 19 | 0.0,1.0,0.0, 20 | 1.0,-4.0,1.0, 21 | 0.0,1.0,0.0 22 | ); 23 | //最终的颜色值 24 | vec4 sum=vec4(0,0,0,0); 25 | //颜色求和 26 | for(int i=0;i<9;i++){ 27 | sum=sum+kernelValues[i]*scaleFactor*texture(sTexture, vTextureCoord+offsets[i]/stStep); 28 | } 29 | outColor=sum; 30 | } -------------------------------------------------------------------------------- /08_ImageProcessing/Emboss.frag: -------------------------------------------------------------------------------- 1 | #version 400 2 | #extension GL_ARB_separate_shader_objects : enable 3 | #extension GL_ARB_shading_language_420pack : enable 4 | layout (binding = 1) uniform sampler2D sTexture; 5 | layout (location = 0) in vec2 vTextureCoord; 6 | layout (location = 0) out vec4 outColor; 7 | void main() { 8 | //纹理偏移量单位步进 9 | const float stStep = 512.0; 10 | const float scaleFactor = 1.0;//给出最终求和时的加权因子(为调整亮度) 11 | //给出卷积内核中各个元素对应像素相对于待处理像素的纹理坐标偏移量 12 | vec2 offsets[9]=vec2[9]( 13 | vec2(-1.0,-1.0),vec2(0.0,-1.0),vec2(1.0,-1.0), 14 | vec2(-1.0,0.0),vec2(0.0,0.0),vec2(1.0,0.0), 15 | vec2(-1.0,1.0),vec2(0.0,1.0),vec2(1.0,1.0) 16 | ); 17 | //卷积内核中各个位置的值 18 | float kernelValues[9]=float[9] ( 19 | 2.0,0.0,2.0, 20 | 0.0,0.0,0.0, 21 | 3.0,0.0,-6.0 22 | ); 23 | //最终的颜色值 24 | vec4 sum=vec4(0,0,0,0); 25 | //颜色求和 26 | for(int i=0;i<9;i++){ 27 | sum=sum+kernelValues[i]*scaleFactor*texture(sTexture, vTextureCoord+offsets[i]/stStep); 28 | } 29 | outColor=sum; 30 | } -------------------------------------------------------------------------------- /08_ImageProcessing/GaussianBlur.frag: -------------------------------------------------------------------------------- 1 | #version 400 2 | #extension GL_ARB_separate_shader_objects : enable 3 | #extension GL_ARB_shading_language_420pack : enable 4 | layout (binding = 1) uniform sampler2D sTexture; 5 | layout (location = 0) in vec2 vTextureCoord; 6 | layout (location = 0) out vec4 outColor; 7 | void main() { 8 | //纹理偏移量单位步进 9 | const float stStep = 256.0; 10 | const float scaleFactor = 1.0/209.0;//给出最终求和时的加权因子(为调整亮度) 11 | //给出卷积内核中各个元素对应像素相对于待处理像素的纹理坐标偏移量 12 | vec2 offsets[9]=vec2[9]( 13 | vec2(-1.0,-1.0),vec2(0.0,-1.0),vec2(1.0,-1.0), 14 | vec2(-1.0,0.0),vec2(0.0,0.0),vec2(1.0,0.0), 15 | vec2(-1.0,1.0),vec2(0.0,1.0),vec2(1.0,1.0) 16 | ); 17 | //卷积内核中各个位置的值 18 | float kernelValues[9]=float[9] ( 19 | 16.0,26.0,16.0, 20 | 26.0,41.0,26.0, 21 | 16.0,26.0,16.0 22 | ); 23 | //最终的颜色值 24 | vec4 sum=vec4(0,0,0,0); 25 | //颜色求和 26 | for(int i=0;i<9;i++){ 27 | sum=sum+kernelValues[i]*scaleFactor*texture(sTexture, vTextureCoord+offsets[i]/stStep); 28 | } 29 | outColor=sum; 30 | } -------------------------------------------------------------------------------- /08_ImageProcessing/MeanBlur.frag: -------------------------------------------------------------------------------- 1 | #version 400 2 | #extension GL_ARB_separate_shader_objects : enable 3 | #extension GL_ARB_shading_language_420pack : enable 4 | layout (binding = 1) uniform sampler2D sTexture; 5 | layout (location = 0) in vec2 vTextureCoord; 6 | layout (location = 0) out vec4 outColor; 7 | void main() { 8 | //纹理偏移量单位步进 9 | const float stStep = 256.0; 10 | const float scaleFactor = 1.0/5.0;//给出最终求和时的加权因子(为调整亮度) 11 | //给出卷积内核中各个元素对应像素相对于待处理像素的纹理坐标偏移量 12 | vec2 offsets[9]=vec2[9]( 13 | vec2(-1.0,-1.0),vec2(0.0,-1.0),vec2(1.0,-1.0), 14 | vec2(-1.0,0.0),vec2(0.0,0.0),vec2(1.0,0.0), 15 | vec2(-1.0,1.0),vec2(0.0,1.0),vec2(1.0,1.0) 16 | ); 17 | //卷积内核中各个位置的值 18 | float kernelValues[9]=float[9] ( 19 | 0.0,1.0,0.0, 20 | 1.0,1.0,1.0, 21 | 0.0,1.0,0.0 22 | ); 23 | //最终的颜色值 24 | vec4 sum=vec4(0,0,0,0); 25 | //颜色求和 26 | for(int i=0;i<9;i++){ 27 | sum=sum+kernelValues[i]*scaleFactor*texture(sTexture, vTextureCoord+offsets[i]/stStep); 28 | } 29 | outColor=sum; 30 | } -------------------------------------------------------------------------------- /08_ImageProcessing/Sharpen.frag: -------------------------------------------------------------------------------- 1 | #version 400 2 | #extension GL_ARB_separate_shader_objects : enable 3 | #extension GL_ARB_shading_language_420pack : enable 4 | layout (binding = 1) uniform sampler2D sTexture; 5 | layout (location = 0) in vec2 vTextureCoord; 6 | layout (location = 0) out vec4 outColor; 7 | void main() { 8 | //纹理偏移量单位步进 9 | const float stStep = 512.0; 10 | const float scaleFactor = 1.0;//给出最终求和时的加权因子(为调整亮度) 11 | //给出卷积内核中各个元素对应像素相对于待处理像素的纹理坐标偏移量 12 | vec2 offsets[9]=vec2[9]( 13 | vec2(-1.0,-1.0),vec2(0.0,-1.0),vec2(1.0,-1.0), 14 | vec2(-1.0,0.0),vec2(0.0,0.0),vec2(1.0,0.0), 15 | vec2(-1.0,1.0),vec2(0.0,1.0),vec2(1.0,1.0) 16 | ); 17 | //卷积内核中各个位置的值 18 | float kernelValues[9]=float[9] ( 19 | 0.0,-1.0,0.0, 20 | -1.0,5.0,-1.0, 21 | 0.0,-1.0,0.0 22 | ); 23 | //最终的颜色值 24 | vec4 sum=vec4(0,0,0,0); 25 | //颜色求和 26 | for(int i=0;i<9;i++){ 27 | sum=sum+kernelValues[i]*scaleFactor*texture(sTexture, vTextureCoord+offsets[i]/stStep); 28 | } 29 | outColor=sum; 30 | } -------------------------------------------------------------------------------- /08_ImageProcessing/SmoothFilter.frag: -------------------------------------------------------------------------------- 1 | #version 400 2 | #extension GL_ARB_separate_shader_objects : enable 3 | #extension GL_ARB_shading_language_420pack : enable 4 | layout (binding = 1) uniform sampler2D sTexture;//纹理采样器 5 | layout (location = 0) in vec2 vTextureCoord;//纹理坐标 6 | layout (location = 0) out vec4 outColor;//输出片元颜色 7 | void main() { 8 | //纹理偏移量单位步进 9 | const float stStep = 512.0; 10 | const float scaleFactor = 1.0/9.0;//给出最终求和时的加权因子(为调整亮度) 11 | //给出卷积内核中各个元素对应像素相对于待处理像素的纹理坐标偏移量 12 | vec2 offsets[9]=vec2[9]( 13 | vec2(-1.0,-1.0),vec2(0.0,-1.0),vec2(1.0,-1.0), 14 | vec2(-1.0,0.0),vec2(0.0,0.0),vec2(1.0,0.0), 15 | vec2(-1.0,1.0),vec2(0.0,1.0),vec2(1.0,1.0) 16 | ); 17 | //卷积内核中各个位置的值 18 | float kernelValues[9]=float[9] ( 19 | 1.0,1.0,1.0, 20 | 1.0,1.0,1.0, 21 | 1.0,1.0,1.0 22 | ); 23 | //最终的颜色值 24 | vec4 sum=vec4(0,0,0,0); 25 | //颜色求和 26 | for(int i=0;i<9;i++){ 27 | sum=sum+kernelValues[i]*scaleFactor*texture(sTexture, vTextureCoord+offsets[i]/stStep); 28 | } 29 | outColor=sum; 30 | } -------------------------------------------------------------------------------- /10_VolumetricFog/commonTexLand.frag: -------------------------------------------------------------------------------- 1 | #version 400 2 | #extension GL_ARB_separate_shader_objects : enable 3 | #extension GL_ARB_shading_language_420pack : enable 4 | layout (std140,set = 0, binding = 0) uniform bufferVals { //一致块 5 | vec4 uCamaraLocation;//摄像机位置 6 | float startAngle;//正弦函数起始角度 7 | } myBufferVals; 8 | layout (binding = 1) uniform sampler2D tCaodi;//传入的草地纹理 9 | layout (binding = 2) uniform sampler2D tXued;//传入的雪地纹理 10 | layout (location = 0) in vec2 inTexCoor;//传入的纹理坐标 11 | layout (location = 1) in float landHeight;//传入的当前顶点的高度(物体坐标系) 12 | layout (location = 2) in vec4 pLocation;//当如的当前顶点位置(世界坐标系) 13 | layout (location = 0) out vec4 outColor;//传给渲染管线的最终片元颜色值 14 | const float slabY=60.0f;//雾平面的高度 15 | const float QFheight=5.0f;//雾平面起伏高度 16 | const float WAngleSpan=12*3.1415926f;//雾的总角度跨度 17 | float tjFogCal(vec4 pLocation){//计算体积雾浓度因子的方法 18 | float xAngle=pLocation.x/960.0f*WAngleSpan;//计算出顶点X坐标折算出的角度 19 | float zAngle=pLocation.z/960.0f*WAngleSpan;//计算出顶点Z坐标折算出的角度 20 | float slabYFactor=sin(xAngle+zAngle+myBufferVals.startAngle)*QFheight;//联合起始角计算出角度和的正弦值 21 | //求从摄像机到待处理片元的射线参数方程Pc+(Pp-Pc)t与雾平面交点的t值 22 | float t=(slabY+slabYFactor-myBufferVals.uCamaraLocation.y)/(pLocation.y-myBufferVals.uCamaraLocation.y); 23 | //有效的t的范围应该在0~1的范围内,若不存在范围内表示待处理片元不在雾平面以下 24 | if(t>0.0&&t<1.0){//若在有效范围内则 25 | //求出射线与雾平面的交点坐标 26 | float xJD=myBufferVals.uCamaraLocation.x+(pLocation.x-myBufferVals.uCamaraLocation.x)*t; 27 | float zJD=myBufferVals.uCamaraLocation.z+(pLocation.z-myBufferVals.uCamaraLocation.z)*t; 28 | vec3 locationJD=vec3(xJD,slabY,zJD); 29 | float L=distance(locationJD,pLocation.xyz);//求出交点到待处理片元位置的距离 30 | float L0=20.0; 31 | return L0/(L+L0);//计算体积雾的雾浓度因子 32 | }else{ 33 | return 1.0f;//若待处理片元不在雾平面以下,则此片元不受雾影响 34 | } 35 | } 36 | void main() { 37 | float height1=90;//混合纹理起始高度 38 | float height2=180;//混合纹理结束高度 39 | vec4 colorCaodi=textureLod(tCaodi, inTexCoor, 0.0);//采样出草地颜色 40 | vec4 colorSand=textureLod(tXued, inTexCoor, 0.0);//采样出雪地颜色 41 | if(landHeight 3 | 4 | - [知乎专栏](https://zhuanlan.zhihu.com/graphics-douysu) 5 | - [博客地址](https://blog.csdn.net/ModestBean) 6 | 7 | 8 | # 博客地址 9 | 10 | [博客地址](http://blog.csdn.net/ModestBean) 11 | 12 | 案例大部分来自《OpenGL ES 3.x 游戏开发》,因个人负责书籍的升级工作,遂重新整理了着色器内容。 13 | 14 | # 需要 15 | 16 | - GLSL 17 | - OpenGL ES 18 | 19 | 当然,其他着色语言需要根据算法进行修改,例如Cg。 20 | 21 | # 目录 22 | 23 | 内容 | 源代码位置 | 效果 | 24 | -|-|-| 25 | 01_关键帧动画效果顶点着色器的实现| [源代码位置](./01_KeyFrame) | | 26 | 02_树干弯曲效果顶点着色器的实现:| [源代码位置](./02_TreeTrunk) | | 27 | 03_波动效果顶点着色器的实现:| [源代码位置](./03_Fluctuation) | | 28 | 04_旋转扭动效果顶点着色器的实现:| [源代码位置](./04_Spin) | | 29 | 05_扭曲效果顶点着色器的实现:| [源代码位置](./05_Distortion) | | 30 | 06_膨胀效果顶点着色器的实现:| [源代码位置](./06_Swell) | | 31 | 07_砖头墙壁纹理片元着色器实现:| [源代码位置](./07_Brick) | | 32 | 08_着色器滤镜、图像卷积与滤波、数字图像处理:| [源代码位置](./08_ImageProcessing) | | 33 | 10_体积雾特效的使用:| [源代码位置](./10_VolumetricFog) | | 34 | -------------------------------------------------------------------------------- /result/r1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/douysu/shader/48896e432febc7ff7d05ff645724c4f6747b1dc1/result/r1.gif -------------------------------------------------------------------------------- /result/r10.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/douysu/shader/48896e432febc7ff7d05ff645724c4f6747b1dc1/result/r10.gif -------------------------------------------------------------------------------- /result/r2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/douysu/shader/48896e432febc7ff7d05ff645724c4f6747b1dc1/result/r2.gif -------------------------------------------------------------------------------- /result/r3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/douysu/shader/48896e432febc7ff7d05ff645724c4f6747b1dc1/result/r3.gif -------------------------------------------------------------------------------- /result/r4.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/douysu/shader/48896e432febc7ff7d05ff645724c4f6747b1dc1/result/r4.gif -------------------------------------------------------------------------------- /result/r5.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/douysu/shader/48896e432febc7ff7d05ff645724c4f6747b1dc1/result/r5.gif -------------------------------------------------------------------------------- /result/r6.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/douysu/shader/48896e432febc7ff7d05ff645724c4f6747b1dc1/result/r6.gif -------------------------------------------------------------------------------- /result/r9.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/douysu/shader/48896e432febc7ff7d05ff645724c4f6747b1dc1/result/r9.gif -------------------------------------------------------------------------------- /result/shu1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/douysu/shader/48896e432febc7ff7d05ff645724c4f6747b1dc1/result/shu1.png -------------------------------------------------------------------------------- /result/shu2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/douysu/shader/48896e432febc7ff7d05ff645724c4f6747b1dc1/result/shu2.png -------------------------------------------------------------------------------- /result/zhuan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/douysu/shader/48896e432febc7ff7d05ff645724c4f6747b1dc1/result/zhuan.png --------------------------------------------------------------------------------