Actually... thinking about this... I have had problems with Safari not supporting webgl.
Try another browser? Thanks again, -- Raul On Sat, Jan 11, 2014 at 8:51 PM, Brian Schott <[email protected]> wrote: > After trying to overcome some line wrap problems, I am getting an error in > Safari. > > [Error] TypeError: 'null' is not an object (evaluating 'gl.createProgram') > beginProgram (webgl.html, line 25) > onload (webgl.html, line 44) > > Line 25: var program = gl.createProgram(); > Line 44: program = beginProgram(gl, '2d-fragment-shader', > '2d-vertex-shader'); > > Any ideas? > > And > > > On Sat, Jan 11, 2014 at 8:22 PM, Raul Miller <[email protected]> wrote: > >> Here's an example of using webgl. It's a start of what might turn into >> a paint program. >> >> If it's working right you should see a green square on the page when >> it loads. Drag the mouse over it and random colored squares will >> appear with a magenta triangle on the right (over top of the drawing - >> the green square underneath). >> >> My next step, I think, will involve introducing a second "program" - >> my understanding is that a webgl "program" always consists of the two >> shaders and that different operations are performed by using different >> programs. In J terms, a shader is probably best thought of as a >> specialized gerund (one for position with vertices being an item, one >> for color where a "pixel" or a "fragment" being an item), a program as >> a conjunction or the verb which results after giving the conjunction a >> pair of these shaders. >> >> The subtle distinction between a pixel and a fragment is also kind of >> interesting, but I want to try more things so I have a better >> understanding of the capabilities of this kind of system. >> >> I am also thinking of writing a J-like library so I can work with >> comfortable-ish operations in javascript (maybe closer to VSAPL than >> true J, because I just want basic functionality - if I want to do >> heavy duty computation I think I'd prefer to use JHS, and the >> limitations of browser access to things like files only reinforce that >> impression). >> >> Anyways, since other people are working with webgl, perhaps this is of >> interest. (I should also note that I've not made any significant >> effort to make this portable, so I have no idea if it will work for >> you. If nothing else, not all browsers even support webgl.) >> >> Thanks, >> >> -- >> Raul >> >> <html> >> <title>WebGL Example</title> >> <script src=" >> http://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script> >> <script> >> >> function useShader(gl, program, scriptId) { >> var shaderScript= document.getElementById(scriptId); >> console.log('shaderScript: ',shaderScript); >> var shaderType= gl[shaderScript.type.replace(/.*\//,'')]; >> console.log('shaderType: ',shaderType); >> var shader= gl.createShader(shaderType); console.log('shader: >> ',shader); >> gl.shaderSource(shader, shaderScript.text); >> gl.compileShader(shader); >> var compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS); >> console.log('compiled: ',compiled); >> if (!compiled) { >> throw('error creating shader "' + scriptId + '": ' + >> gl.getShaderInfoLog(shader)); >> } >> gl.attachShader(program, shader); >> return shader; >> }; >> >> function beginProgram(gl, pixelShader, vertexShader) { >> var program = gl.createProgram(); console.log('program: ',program); >> useShader(gl, program, pixelShader); console.log('pixel shader: >> ',pixelShader); >> useShader(gl, program, vertexShader); console.log('vertex >> shader',vertexShader); >> gl.linkProgram(program); >> if (!gl.getProgramParameter(program, gl.LINK_STATUS)) >> {throw('error from linkProgram: '+gl.getProgramInfoLog(program))} >> gl.useProgram(program); >> return program; >> }; >> >> window.onload = function() { >> window.canvas = document.getElementById("canvas"); >> console.log('canvas: ',canvas); >> window.gl = canvas.getContext('webgl', {preserveDrawingBuffer: >> true}); console.log('graphics library: ',gl); >> window.bcr= canvas.getBoundingClientRect(); console.log('bounding >> client rectangle (left, top): ',bcr, bcr.left, bcr.top); >> program = beginProgram(gl, '2d-fragment-shader', '2d-vertex-shader'); >> >> gl.bindBuffer(gl.ARRAY_BUFFER, gl.createBuffer()); >> >> // tell vertex shader the size of our drawing region >> gl.uniform2f(gl.getUniformLocation(program, "resolution"), >> canvas.width, canvas.height); >> >> // and where each vertex is - our array buffer will be shaped as a >> list of coordinate pairs >> var positionLocation = gl.getAttribLocation(program, "position"); >> console.log('positionLocation: ',positionLocation); >> gl.enableVertexAttribArray(positionLocation); >> gl.vertexAttribPointer(positionLocation, 2, gl.FLOAT, false, 0, 0); >> >> // meanwhile, our fragment shader will need to know what color we >> are drawing >> window.colorLocation= gl.getUniformLocation(program, 'color'); >> console.log('colorLocation: ',colorLocation); >> >> // example of rendering: draw a pair of green triangles to form a >> square >> gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([20,30, 50,30, >> 20,60, 20,60, 50,30, 50,60]), gl.STATIC_DRAW); >> gl.uniform4f(colorLocation, 0, 1, 0, 1); // (red,green,blue,alpha) >> gl.drawArrays(gl.TRIANGLES, 0, 6); >> >> self.mousedown= 0; >> $('#canvas').on('mousedown', function(e) {render(1,e)}); >> $('#canvas').on('mousemove', function(e) {render(0,e)}); >> $('body').on('mouseup', function(e) {render(-1,e)}); >> window.gl = canvas.getContext('webgl'); console.log('gl: ',gl); >> >> } >> >> function render(mode, e) { >> if (0===mode && 1===mousedown) { >> var x= e.clientX-bcr.left; >> var y= e.clientY-bcr.top; >> var width= 9; >> var height=9; >> >> gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ >> x, y, >> x+width, y, >> x, y+height, >> x, y+height, >> x+width, y, >> x+width, y+height]), gl.STATIC_DRAW); >> gl.uniform4f(colorLocation, Math.random(), Math.random(), >> Math.random(), 1); >> gl.drawArrays(gl.TRIANGLES, 0, 6); >> >> // each time we add something to the screen put a purple triangle on top >> of it >> gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ >> 310, 10, >> 390, 80, >> 310, 149]), gl.STATIC_DRAW); >> gl.uniform4f(colorLocation, 1, 0, 1, 1); >> gl.drawArrays(gl.TRIANGLES, 0, 3); >> } else { >> self.mousedown= mode; >> } >> } >> >> function randomInt(range){return Math.floor(Math.random()*range);} >> >> </script> >> <script id="2d-vertex-shader" type="x-shader/VERTEX_SHADER"> >> attribute vec2 position; >> uniform vec2 resolution; >> void main() { >> vec2 zeroToOne = position / resolution; // convert the rectangle >> from pixels to 0.0 to 1.0 >> vec2 zeroToTwo = zeroToOne * 2.0; // convert from 0->1 to 0->2 >> vec2 clipSpace = zeroToTwo - 1.0; // convert from 0->2 to -1->+1 >> (clipspace) >> gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1); >> } >> </script> >> <script id="2d-fragment-shader" type="x-shader/FRAGMENT_SHADER"> >> precision mediump float; >> uniform vec4 color; >> void main() { >> gl_FragColor = color; >> } >> </script> >> >> </head> >> <body style="margin: 8px"> >> <canvas id="canvas" width="400" height="300"></canvas> >> </body> >> </html> >> ---------------------------------------------------------------------- >> For information about J forums see http://www.jsoftware.com/forums.htm >> > > > > -- > (B=) <-----my sig > Brian Schott > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
