Pas2JS_WebGL_Minimal.pas 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. program Pas2JS_WebGL_Minimal;
  2. uses
  3. GLUtils, GLTypes, SysUtils,
  4. BrowserConsole, Web, WebGL, WebGL2, JS, Math;
  5. var
  6. gl: TJSWebGLRenderingContext;
  7. shader: TShader;
  8. var
  9. canvas: TJSHTMLCanvasElement;
  10. stride: integer;
  11. offset: integer;
  12. vertexShaderSource: string;
  13. fragmentShaderSource: string;
  14. buffer: TJSWebGLBuffer;
  15. verts: TJSArray;
  16. begin
  17. // https://webglfundamentals.org/webgl/lessons/webgl-fundamentals.html
  18. // make webgl context
  19. canvas := TJSHTMLCanvasElement(document.createElement('canvas'));
  20. canvas.width := 300;
  21. canvas.height := 300;
  22. document.body.appendChild(canvas);
  23. gl := TJSWebGLRenderingContext(canvas.getContext('webgl'));
  24. if gl = nil then
  25. begin
  26. writeln('failed to load webgl!');
  27. exit;
  28. end;
  29. // create shaders from source in html
  30. vertexShaderSource := document.getElementById('vertex.glsl').textContent;
  31. fragmentShaderSource := document.getElementById('fragment.glsl').textContent;
  32. shader := TShader.Create(gl, vertexShaderSource, fragmentShaderSource);
  33. shader.Compile;
  34. shader.Link;
  35. shader.Use;
  36. // prepare context
  37. gl.clearColor(0.9, 0.9, 0.9, 1);
  38. gl.viewport(0, 0, canvas.width, canvas.height);
  39. gl.clear(gl.COLOR_BUFFER_BIT);
  40. // create verticies in OpenGL coords
  41. verts := TJSArray.new(
  42. 0, 0, // 1
  43. 0, 0.5, // 2
  44. 0.7, 0 // 3
  45. );
  46. // create buffer
  47. buffer := gl.createBuffer;
  48. gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
  49. gl.bufferData(gl.ARRAY_BUFFER, TJSFloat32Array.new(TJSObject(verts)), gl.STATIC_DRAW);
  50. // describe vertex data for buffer
  51. offset := 0;
  52. stride := 4 * 2; // float * 2 = Vec2
  53. gl.enableVertexAttribArray(0);
  54. gl.vertexAttribPointer(0, 2, gl.FLOAT, false, stride, offset);
  55. gl.drawArrays(gl.TRIANGLES, 0, 3);
  56. end.