ééé¨èé°¨é¨_Hahn_20190108éè 566èèèè§è§è§¤é°¨°è¨°éèè±èèéè±è¤rejuvenateè¤èé¤èè褱°è豷騤·é°èè騷é·è°·¤é¨èèè°é±é¨¨±èèé°¤èè騨±°°¤éé餧±¨°°è°··é·±¤éè§éè¤è±è騨è觰°±è°èéè褨è騱¨°±èè°°èèèè騱°±èè°è§è§¨èè· 3D ¨è±èèèèè¨è§ééè 3D ¨ 2D è 2D ¨é°èè··±èééèè°¤éé¨éè騨è°èéèèè§è±è§è§è¨è°1. ¨ 2D ¨¨èé¤ 3D ¨¤§é§¨¨éè§...è±é°±è±è觰±°°è§èé訧è¨è§±èé¨ 24 §§°±è 2D ¨éè§è 24 é¨è°±¨§°11°·¨ 1357....è± 12 §§ 2 éè§è§è¨è¨°è¨¨é·é¨è§Imageworks ··èè·èè¨é¨è±èééèèèé褧±§é°°ééè·è訨è¨èè§é¤é°±ééè±é¨ééèé¨è±èéèè¨4. è/éèé±éé°è§èèè餧è¨éèèé¤èè±·¤ Peter Ramsey ¨éèè±éè§é§è¨è±è¨°±è訰éééè°·éè鰤跰±è§¨èè±éé¤è¨è·è§é¨¨éèè°éè/éè¨è鰱跰訨°°·¨ 20 °·è° CMYK 4è°·è·°è·èéè·é¨é±§é¤¨°è¨°±èè¨è°èè§è§±é¨è·é§è§è§·±±±è§ 2D é許ééè騱¨è§è§è¨è¤é¤§è¤§é··¨è·èéèéè§è§è許éè°é±é駤¤¨é觱èé±°è·°è§èè§è§¤é°±¤°±è±°¨è¨°°è§°é騰é0°1°è°¨éèè§è§¨·°è±·è§é¤éè OpenGL Shader ¨·±±éèéè Shader °±é¨èè¤è°¤é·é°±è¨èéè§è¨±é¨ Shader ±éè§1. HalfTone è°¤é±éèè§èé¨é¨ Ben-Day dot (è°éèè¨è¨Ben-Day dot HalfTone ¤¨ Ben-Day dot ¨¤§°è HalfTone èéèè°¤§°¨ HalfTone 谤鷤è¨é觧 Ben-Day dot (¨°· Benjamin Henry Day, Jr.19 Benjamin Henry Day ¨ 1879 è°·éèè§éè§éè°èé餧°ééèèééè°±è20 50 60 èè¨éé°·¤¨é¨+¤±è°è¨è·°éé褧è¨èè鱤è§èééèééèé駨éprecision highp float; uniform sampler2D inputImageTexture;uniform sampler2D inputImageTexture2;varying vec2 textureCoordinate;uniform float time;float amount gl_FragColor = vec4(finalColor, 1.0);}¤·éè Demo 觤é°Demo23. RGB Shift/Split RGB °é Glitch ·¨° RGB é許°¤§éè·è¨°èé§èShader °è·é¤¤ééè RGB é觰±°precision highp float;uniform sampler2D inputImageTexture;varying vec2 textureCoordinate;uniform float time;float amount = 0.01;float angle = 0.;void main() { vec2 offset = amount * vec2(cos(time*.001), sin(time*.001)); vec4 cr = texture2D(inputImageTexture, textureCoordinate + offset); vec4 cga = texture2D(inputImageTexture, textureCoordinate); vec4 cb = texture2D(inputImageTexture, textureCoordinate - offset); gl_FragColor = vec4(cr.r, cga.g, cb.b, cga.a);}¤é¤·éè Demo 觤é°Demo3è騱褤¤¤¤¤èè§èé°èè§è§é°è§èèèè¨è·¤ Sony è°rejuvenate¤è觰è±é°¨èèèé¨é·¨°¤è¨èé·é¨°±·¨·±è§èè°è§è觤¤±¤ééèéèèè°èéèè°ééé°±è¨èèéééèéèè°è§±èèé餤§è§éwww.gcores.com/articles/10deadline.com/2018/12/sonwww.zhihu.com/question/29www.douban.com/review/9831en.wikipedia.org/wiki/Ben-Dawww.bilibili.com/video/av768wapbaike.baidu.com/tashuo/browwww.docin.com/p-92574055.¨é°¤OpenGLèé觨°é°éGitHubDribbbleProductHunt èè·èé觨è·éè¨é§èèLanslord褧2°F1ashGP6663°¨è_Hahn_17°OpenGLèèèè§è§è§¤é°182Cang_Wang10¤C++OpenGL[OpenGL]è§è§-MagicCamera3¨1641iOSJavaRust §¨è·¨°¤é 2018.12.9227KoonChaoSo1iOS¨iOS¨¨¨èè°244·¨3Life of a Pixeléè觨±¤11581iOSRustgfx-rs/halè·¨°è±¨41028¤OpenGLOpenGL/ESè§è§gfx-hal(Vulkan) Shader/Program¨2éé±4iOS°flutterè·¤12312SimonLeeeeeeeee8AndroidAndroid°XCodeScannerè°2018-08-17447401iOSC++Rustgfx-hal 駨62è_Hahn_UI ·¨è·è°240è·éè°6,398é° Python °·è°· 9.9519.9Git è觨°· 14.9529.9°¤é45°°é Shader èè3611Shader ¨331WebGL Shader 384Shader é¨Gaussion Blur220Shader 訨Motion Blur223è§è§è¨è°1. ¨ 2D ¨2. è3. ¨è¨¨4. è/éèè§è§¤é°1. HalfTone è°¤é2. Glitch é3. RGB Shift/Split RGB é觨 - èé45°°ééé¨èé°¨é¨chokcoco20190109éè 1733è CSS ¨èééè¨ CSS °è°¨scrollbar°±éé¨éè¨èééé¨èè騧éè°èèé訰è JS è·§°è°OK§è¨è¨é°±°ééè Javascript è§é¨è¨ CSS èimageé±°èè§èè·é¨¨é CSS èèééé¨è·è¨ CSS °èèè¨è¨·§é°±··§¨ CSS è騷¨ééè·ééé¨èèè·è°±é·è°±èéé¨è·éé¨è°é±é訧°èèèééèè¨ ¨ body·è··°°è§§body { background-image: linear-gradient(to right top, #ffcc00 50%, #eee 50%); background-repeat: no-repeat;}¤é°è·scrollbar2Wowéèéè·èè¨èè°èéèè·ééè訤é¨ébody::after { content: ""; position: fixed; top: 5px; left: 0; bottom: 0; right: 0; background: #fff; z-index: -1;}¤¤éèéèéscrollbar3éèè·scrollbar4°è°è·°è°image body §éè body ¤§°è°ébody { background-image: linear-gradient(to right top, #ffcc00 50%, #eee 50%); background-size: 100% calc(100% - 100vh + 5px); background-repeat: no-repeat;}¤èé¨ calc èèè 100vh°±±éè·¨¨°é¨è§èè + 5px ¨èéé 5px éscrollbarè¤èé±°±°é°·§ DemoCodePen Demo -- ¨§°¨èimageèééé°·§¤é°è CSS è駧CSS-Inspiration -- CSS¤ CSS ±¨ Github -- iCSS °è star èéè°¤ :)èéè褤¤é褨鰤CSSèé觨°é°éGitHubDribbbleProductHunt èè·èé觨è·éè¨é§èègodbmw @ èè·Star1é ·¨§18échenry§22éééè§èèhttp://youmightnotneedjs.com/éé30騰§31éT_oneèéé36é¨èchokcoco2°CSSè CSS ¨è10743¤5°éèéè·§20379CRPER2°Visual Studio CodeVS Code èè° - (15) ¨è¤§é¨(é)454Seymoe3°¨24K 駱 | é1220èèIVWEBé6°¨¨ SRI è§ CDN 4415¨21°¤§èé18013sunshine°°16°±éèD2 461é22°true || false && false2941¨¨è2¤JavaScriptèé4-2Object.assign °30836ShanaMaid42éTypeScriptArcher-svgs: ¨èsvg1èchokcoco @ Tencentèèè·è°6,494è·éè°100,844é° Python °·è°· 9.9519.9Vue.js è°· 14.9529.9°¤é45°°éèCSSèè·é114893¨è§·CSS ¨è104240é¨ :focus-within45841é CSS é±·§è43030¨ scale transfrom-origin§¨26218é±°é±é觨 - èé45°°ééé¨èé°¨é¨roberthuang20190108éè 3663mpvue+°¨°¤éè·è¨¤·éééè¨è°OnceLoveè·°¨éUIé跱鰨mpvue°±è·±¤éè·è±3¤é¨èèèè·±°è·é°ééèè·±°èéè·è·é±èèé餧°èèééè·±°¨èé°éè·±°é°é°è¨°¨¤¨°¨±°è谨褧é°èèéé°è¤§ééé¨è¨°https://gitee.com/roberthuang123/wedding§¨¤·mpvue mpvue°¨· °¨·¨¨mpvueévue¨é§¨common±èjs,css,jsoncomponents.vueé¨èépagesééé¨èutils¨mpvueè¨app.json{ "pages": [ "pages/index/main", "pages/photo/main", "pages/map/main", "pages/greet/main", "pages/message/main" ], "window": { "backgroundTextStyle": "light", "navigationBarBackgroundColor": "#fff", " "pagePath": "pages/greet/main", "iconPath": "static/images/4-1.png", "selectedIconPath": "static/images/4-2.png", "text": "" }, { "pagePath": "pages/message/main", "iconPath": "static/images/5-1.png", "selectedIconPath": "static/images/5-2.png", "text": "è¨èè" } ] }, "requiredBackgroundModes": ["audio"]}¤§¨App.vueèé°é¨è¤§¨main.jsimport Vue from vue import App from ./App Vue.config.productionTip = falseApp.mpType = app wx.cloud.init({ env: ID })const app = new Vue(App)app.$mount()¤§¨functionsè°èé°éimagesèéèéééééè·éé餧èè§èé°const audioCtx = wx.createInnerAudioContext()éwx.createInnerAudioContext è·éè°éè°¨éé·¤§¨¨°èéè·¤§¨èé°±èè鰱褰éèééè°mapmap map¨èéèè°markersdata () { return { // qqSdk: , markers: [{ iconPath: ../../static/images/nav.png , id: 0, latitude: 30.08059, longitude: 115.93027, width: 50, height: 50 }] } }¤§¨
°é
°¨
¤§¨ééè¨éé°¨project.config.json"cloudfunctionRoot": "static/functions/"¤§¨èèééè°éè¨éèjsonéècloudfunctionRoot ¨°app.json"window": { "backgroundTextStyle": "light", "navigationBarBackgroundColor": "#§¨°¤ééè·èéègetMusicUrl () { const that = this const db = wx.cloud.database() const music = db.collection( music ) music.get().then(res => { let musicUrl = res.data[0].musicUrl audioCtx.src = musicUrl audioCtx.loop = true audioCtx.play() that.getList() })}¤§¨ééè·è°getList () { const that = this const db = wx.cloud.database() const banner = db.collection( banner ) banner.get().then(res => { that.list = res.data[0].bannerList })}¤§¨é¨·é¨¨·¤§¨èéééèè·éè¨getUserList () { const that = this wx.cloud.callFunction({ name: use§¨èè¨èè¨è餧èè§èè°éééè°°èèèèè¤é¤èè·±é¨èèé¤éè·±¨éèopenid§é¤éè§è§èè¨è¨°éè°°éé¤éè¨éè訨-¨è·èè訤°¨è餧鰱谷èé°°°è¨¤§¨èè°è±é°§è·é°±è·±¤§è°±è¤°¤§è§éè°èè°¤§¨¨é°¤°¨·èé觨°é°éGitHubDribbbleProductHunt èè·èé觨è·éè¨é§èè°¨2°fernandoxu°±·5°roberthuang(è)·è8°FlyingAir¤ roberthuang(è): è°7°_lemon°8°é8°¨_·¨ @ è訷觰bug餰觰±èèèè¨17°¨èroberthuang1¤°¨·mpvue+°¨°¤éè·12249èèé§23°°¨··¨é·è¨1CHENGXI28¤°¨°¨·1è·è¨·°¨405èè¤4°¨·°¨· éé571stupidWall1Node.js°¨é233netwjx2°¨°¨·§FAQ323èè·2°¨202èroberthuangè·è°130è·éè°3,975é°Vue.js è°· 14.9529.9React èè¨è·°· 14.9529.9°¤é45°°é·¨é·è¨101è·è¨·°¨405°¨· éé571°¨é233訤·éééé觨 - èé45°°ééé¨èé°¨é¨roberthuang20190108éè 3663mpvue+°¨°¤éè·è¨¤·éééè¨è°OnceLoveè·°¨éUIé跱鰨mpvue°±è·±¤éè·è±3¤é¨èèèè·±°è·é°ééèè·±°èéè·è·é±èèé餧°èèééè·±°¨èé°éè·±°é°é°è¨°¨¤¨°¨±°è谨褧é°èèéé°è¤§ééé¨è¨°https://gitee.com/roberthuang123/wedding§¨¤·mpvue mpvue°¨· °¨·¨¨mpvueévue¨é§¨common±èjs,css,jsoncomponents.vueé¨èépagesééé¨èutils¨mpvueè¨app.json{ "pages": [ "pages/index/main", "pages/photo/main", "pages/map/main", "pages/greet/main", "pages/message/main" ], "window": { "backgroundTextStyle": "light", "navigationBarBackgroundColor": "#fff", " "pagePath": "pages/greet/main", "iconPath": "static/images/4-1.png", "selectedIconPath": "static/images/4-2.png", "text": "" }, { "pagePath": "pages/message/main", "iconPath": "static/images/5-1.png", "selectedIconPath": "static/images/5-2.png", "text": "è¨èè" } ] }, "requiredBackgroundModes": ["audio"]}¤§¨App.vueèé°é¨è¤§¨main.jsimport Vue from vue import App from ./App Vue.config.productionTip = falseApp.mpType = app wx.cloud.init({ env: ID })const app = new Vue(App)app.$mount()¤§¨functionsè°èé°éimagesèéèéééééè·éé餧èè§èé°const audioCtx = wx.createInnerAudioContext()éwx.createInnerAudioContext è·éè°éè°¨éé·¤§¨¨°èéè·¤§¨èé°±èè鰱褰éèééè°mapmap map¨èéèè°markersdata () { return { // qqSdk: , markers: [{ iconPath: ../../static/images/nav.png , id: 0, latitude: 30.08059, longitude: 115.93027, width: 50, height: 50 }] } }¤§¨
°é
°¨
¤§¨ééè¨éé°¨project.config.json"cloudfunctionRoot": "static/functions/"¤§¨èèééè°éè¨éèjsonéècloudfunctionRoot ¨°app.json"window": { "backgroundTextStyle": "light", "navigationBarBackgroundColor": "#§¨°¤ééè·èéègetMusicUrl () { const that = this const db = wx.cloud.database() const music = db.collection( music ) music.get().then(res => { let musicUrl = res.data[0].musicUrl audioCtx.src = musicUrl audioCtx.loop = true audioCtx.play() that.getList() })}¤§¨ééè·è°getList () { const that = this const db = wx.cloud.database() const banner = db.collection( banner ) banner.get().then(res => { that.list = res.data[0].bannerList })}¤§¨é¨·é¨¨·¤§¨èéééèè·éè¨getUserList () { const that = this wx.cloud.callFunction({ name: use§¨èè¨èè¨è餧èè§èè°éééè°°èèèèè¤é¤èè·±é¨èèé¤éè·±¨éèopenid§é¤éè§è§èè¨è¨°éè°°éé¤éè¨éè訨-¨è·èè訤°¨è餧鰱谷èé°°°è¨¤§¨èè°è±é°§è·é°±è·±¤§è°±è¤°¤§è§éè°èè°¤§¨¨é°¤°¨·èé觨°é°éGitHubDribbbleProductHunt èè·èé觨è·éè¨é§èè°¨2°fernandoxu°±·5°roberthuang(è)·è8°FlyingAir¤ roberthuang(è): è°7°_lemon°8°é8°¨_·¨ @ è訷觰bug餰觰±èèèè¨17°¨èroberthuang1¤°¨·mpvue+°¨°¤éè·12249èèé§23°°¨··¨é·è¨1CHENGXI28¤°¨°¨·1è·è¨·°¨405èè¤4°¨·°¨· éé571stupidWall1Node.js°¨é233netwjx2°¨°¨·§FAQ323èè·2°¨202èroberthuangè·è°130è·éè°3,975é°Vue.js è°· 14.9529.9React èè¨è·°· 14.9529.9°¤é45°°é·¨é·è¨101è·è¨·°¨405°¨· éé571°¨é233訤·éééé觨 - èé45°° ¨é§¨°è¤
è
è°°°è 110é50+10§ éé3 ·99 239è
è°°°è