diff --git a/assets/glsl/BgVertex.glsl b/assets/glsl/BgVertex.glsl new file mode 100644 index 0000000..2390448 --- /dev/null +++ b/assets/glsl/BgVertex.glsl @@ -0,0 +1,6 @@ +varying vec3 vWorldPosition; +void main() { + vec4 worldPosition = modelMatrix * vec4( position, 1.0 ); + vWorldPosition = worldPosition.xyz; + gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 ); +} diff --git a/assets/glsl/SkyFragment.glsl b/assets/glsl/SkyFragment.glsl new file mode 100644 index 0000000..ab54179 --- /dev/null +++ b/assets/glsl/SkyFragment.glsl @@ -0,0 +1,22 @@ +// https://gamedevelopment.tutsplus.com/tutorials/a-beginners-guide-to-coding-graphics-shaders--cms-23313 +uniform vec3 topColor; +uniform vec3 horizontColor; +uniform float offset; +uniform float exponent; +varying vec3 vWorldPosition; +void main() { + float h = normalize( vWorldPosition + offset ).y; + gl_FragColor = vec4( + mix( + horizontColor, + topColor, + max( + pow( + max( h , 0.0), + exponent + ), + 0.0 + ) + ), 1.0 + ); +} diff --git a/assets/glsl/WaterFragment.glsl b/assets/glsl/WaterFragment.glsl new file mode 100644 index 0000000..b55bf45 --- /dev/null +++ b/assets/glsl/WaterFragment.glsl @@ -0,0 +1,26 @@ +// https://gamedevelopment.tutsplus.com/tutorials/a-beginners-guide-to-coding-graphics-shaders--cms-23313 +uniform vec3 waterColor; +uniform vec3 bottomColor; +uniform float wateroffset; +uniform float waterexponent; +varying vec3 vWorldPosition; + +void main() { + float h = normalize( vWorldPosition * -1.0 + wateroffset ).y; + gl_FragColor = vec4( + // mix(x, y, a) performs a linear interpolation between x and y using a to weight between them. + // The return value is computed as x×(1−a)+y×a. + mix( + waterColor, + bottomColor, + max( + pow( + max( h , 0.0), + waterexponent + ), + 0.0 + ) + ), + 1.0 + ); +} diff --git a/build/webpack.config.base.js b/build/webpack.config.base.js index aec76be..2ca0f50 100644 --- a/build/webpack.config.base.js +++ b/build/webpack.config.base.js @@ -4,12 +4,13 @@ const HtmlWebpackPlugin = require('html-webpack-plugin') const CopyWebpackPlugin = require('copy-webpack-plugin') const HtmlWebpackHarddiskPlugin = require('html-webpack-harddisk-plugin'); const { VueLoaderPlugin } = require('vue-loader') +// const { GlslLoaderPlugin } = require('webpack-glsl-loader') const utils = require('./utils') module.exports = { resolve: { - extensions: ['.js', '.vue', '.json'], + extensions: ['.js', '.vue', '.json', '.glsl'], alias: { 'assets': utils.resolve('assets'), 'pages': utils.resolve('src/pages'), @@ -28,6 +29,9 @@ module.exports = { }, { test: /\.vue$/, use: 'vue-loader' + }, { + test: /\.glsl$/, + loader: 'webpack-glsl-loader' }, { test: /\.js$/, use: { @@ -73,6 +77,7 @@ module.exports = { }), new HtmlWebpackHarddiskPlugin(), new VueLoaderPlugin(), + // new GlslLoaderPlugin(), new CopyWebpackPlugin([{ from: utils.resolve('static/img'), to: utils.resolve('dist/static/img'), diff --git a/package-lock.json b/package-lock.json index 4b3e251..9e03a68 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7618,6 +7618,12 @@ "readable-stream": "^2.0.0" } }, + "fs": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.2.tgz", + "integrity": "sha1-4fJE7zkzwbKmS9R5kTYGDQ9ZFPg=", + "dev": true + }, "fs-write-stream-atomic": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", @@ -11552,6 +11558,12 @@ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", "dev": true }, + "path": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/path/-/path-0.11.14.tgz", + "integrity": "sha1-y8dWk1XLPIOv60rOQ+z/lSMeWn0=", + "dev": true + }, "path-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", @@ -15161,6 +15173,16 @@ } } }, + "webpack-glsl-loader": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/webpack-glsl-loader/-/webpack-glsl-loader-1.0.1.tgz", + "integrity": "sha1-cqDjAZK9V5R9YNbVBckVvmgNCsw=", + "dev": true, + "requires": { + "fs": "0.0.2", + "path": "^0.11.14" + } + }, "webpack-log": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", diff --git a/package.json b/package.json index 0d24e1b..7db5d65 100644 --- a/package.json +++ b/package.json @@ -70,6 +70,7 @@ "webpack": "^4.43.0", "webpack-cli": "^3.3.12", "webpack-dev-server": "^3.11.0", + "webpack-glsl-loader": "^1.0.1", "webpack-merge": "^4.2.2" } } diff --git a/src/App.vue b/src/App.vue index bebd98d..6701d44 100644 --- a/src/App.vue +++ b/src/App.vue @@ -14,6 +14,8 @@ + + @@ -30,7 +32,7 @@ - +