Attached script grabs shaders from shadertoy, and dumps them out as .shader_test files which can be run through shader-db for compiler testing.
shadertoy only gives you a fragment shader (which works based on gl_FragCoord), so a generic vertex shader is used. And a blurb is inserted for the pre-defined uniforms and main() function (which just calls shadertoy mainImage() fxn). --- TODO I guess we'd actually have to parse the shader to figure out if the sampler uniforms were meant to be 2D/cube/etc. Maybe we just commit samplers we get from the script and massage them by hand? PS. don't make fun of my py too much.. I'm a newb and figuring it out as I go grab-shadertoy.py | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100755 grab-shadertoy.py diff --git a/grab-shadertoy.py b/grab-shadertoy.py new file mode 100755 index 0000000..74e9d10 --- /dev/null +++ b/grab-shadertoy.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python3 + + +import requests, json + +url = 'https://www.shadertoy.com/api/v1/shaders' +key = '?key=NdnKw7' + +# Get the list of shaders +r = requests.get(url + key) +j = r.json() +print('Found ' + str(j['Shaders']) + ' shaders') + +shader_ids = j['Results'] +for id in shader_ids: + print('Fetching shader: ' + str(id)) + r = requests.get(url + '/' + id + key) + j = r.json() + s = j['Shader'] + info = s['info'] + print('Name: ' + info['name']) + print('Description: ' + info['description']) + i = 0; + for p in s['renderpass']: + fobj = open('shaders/shadertoy/' + str(id) + '_' + str(i) + '.shader_test', 'w') + #print('Inputs: ' + str(p['inputs'])) + #print('Outputs: ' + str(p['outputs'])) + fobj.write('[require]\n') + fobj.write('GLSL >= 1.30\n') + fobj.write('\n'); + fobj.write('[fragment shader]\n') + fobj.write('#version 130\n') + # Shadertoy inserts some uniforms, so we need to do the same: + fobj.write('uniform vec3 iResolution;\n'); + fobj.write('uniform float iGlobalTime;\n'); + fobj.write('uniform float iChannelTime[4];\n'); + fobj.write('uniform vec4 iMouse;\n'); + fobj.write('uniform vec4 iDate;\n'); + fobj.write('uniform float iSampleRate;\n'); + fobj.write('uniform vec3 iChannelResolution[4];\n'); + # TODO probably need to parse the shader to figure out if 2d/cubemap/etc + fobj.write('uniform sampler2D iChannel0;\n'); + fobj.write('uniform sampler2D iChannel1;\n'); + fobj.write('uniform sampler2D iChannel2;\n'); + fobj.write('uniform sampler2D iChannel3;\n'); + # Actual shadertoy shader body: + fobj.write(p['code']) + # Shadertoy shader uses mainImage(out vec4 fragColor, in vec2 fragCoord) + # so we need to insert a main: + fobj.write('\nvoid main() { mainImage(gl_FragColor, gl_FragCoord.xy); }\n') + fobj.write('\n\n') + # And a generic vertex shader: + fobj.write('[vertex shader]\n') + fobj.write('#version 130\n') + fobj.write('in vec2 position;\n') + fobj.write('\n') + fobj.write('void main()\n') + fobj.write('{\n') + fobj.write(' gl_Position = vec4(position, 0.0, 1.0);\n') + fobj.write('}\n') + + fobj.close() + i = 1 + i -- 2.4.2 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev