ãã® WebGL ã®ä¾ã§ã¯ããã£ã³ãã¹ã使ãããã®ä¸ã« WebGL ã使ç¨ãã¦å転ããåè§å½¢ãã¬ã³ããªã³ã°ãã¾ããã·ã¼ã³ã表ãããã«ä½¿ç¨ãã座æ¨ç³»ã¯ããã£ã³ãã¹ã®åº§æ¨ç³»ã¨åãã§ããã¤ã¾ãã(0, 0) ã¯å·¦ä¸é ã«ãããå³ä¸é 㯠(600, 460) ã¨ãªãã¾ãã
å転ããæ£æ¹å½¢ã®ä¾æ§ã ãªæé ã§ãå転ããæ£æ¹å½¢ãåå¾ãã¦ã¿ã¾ãããã
é ç¹ã·ã§ã¼ãã¼ã¾ãé ç¹ã·ã§ã¼ãã¼ãè¦ã¦ã¿ã¾ãããããã¤ãã®ããã«ãã·ã¼ã³ã«ä½¿ç¨ãã¦ãã座æ¨ãã¯ãªããã¹ãã¼ã¹åº§æ¨ã«å¤æãããã¨ã§ã (ã¤ã¾ã (0, 0) ãã³ã³ããã¹ãã®ä¸å¿ã«ãããã³ã³ããã¹ãã®å®éã®ãµã¤ãºã«é¢ä¿ãªãå軸ã -1.0 ãã 1.0 ã«ä¼¸ã³ãã·ã¹ãã ã§ã)
<script id="vertex-shader" type="x-shader/x-vertex">
attribute vec2 aVertexPosition;
uniform vec2 uScalingFactor;
uniform vec2 uRotationVector;
void main() {
vec2 rotatedPosition = vec2(
aVertexPosition.x * uRotationVector.y +
aVertexPosition.y * uRotationVector.x,
aVertexPosition.y * uRotationVector.y -
aVertexPosition.x * uRotationVector.x
);
gl_Position = vec4(rotatedPosition * uScalingFactor, 0.0, 1.0);
}
</script>
ã¡ã¤ã³ããã°ã©ã ã¯å±æ§ aVertexPosition
ãå
±æãã¾ããããã¯ä½¿ç¨ãã¦ãã座æ¨ç³»ã®é ç¹ã®ä½ç½®ã§ããä½ç½®ã®ä¸¡æ¹ã®ã³ã³ãã¼ãã³ãã -1.0 ãã 1.0 ã®ç¯å²ã«ãªãããã«ããããã®å¤ã夿ããå¿
è¦ãããã¾ããããã¯ãã³ã³ããã¹ãã®ã¢ã¹ãã¯ãæ¯ã«åºã¥ããã¹ã±ã¼ãªã³ã°ä¿æ°ãæãããã¨ã§ç°¡åã«å®è¡ã§ãã¾ãããã®è¨ç®ã«ã¤ãã¦ã¯ãå¾ã»ã©èª¬æãã¾ãã
å½¢ç¶ãå転ãã夿ãé©ç¨ãããã¨ã§ãããè¡ããã¨ãã§ãã¾ããæåã«ãããè¡ãã¾ããé ç¹ã®å転ä½ç½®ã¯ãJavaScript ã³ã¼ãã«ãã£ã¦è¨ç®ãããåä¸ãª uRotationVector
ã«ããå転ãã¯ãã«ãé©ç¨ãã¦è¨ç®ããã¾ãã
次ã«ãuScalingFactor
ã® JavaScript ã³ã¼ãã«ãã£ã¦æä¾ãããã¹ã±ã¼ãªã³ã°ãã¯ãã«ãå転ä½ç½®ã«ä¹ç®ãããã¨ã«ãããæçµä½ç½®ãè¨ç®ããã¾ãã2D ã§æç»ãã¦ãããããz
㨠w
ã®å¤ã¯ãããã 0.0 㨠1.0 ã«åºå®ããã¦ãã¾ãã
次ã«ãæ¨æº WebGL ã°ãã¼ãã«å¤æ°ã® gl_Position
ã¸å¤æããã³å転ãããé ç¹ã®ä½ç½®ãè¨å®ãã¾ãã
次ã¯ãã©ã°ã¡ã³ãã·ã§ã¼ãã¼ã§ãããã®å½¹å²ã¯ã¬ã³ããªã³ã°ãããå½¢ç¶ã®åãã¯ã»ã«ã®è²ãè¿ããã¨ã§ããã©ã¤ãã£ã³ã°ãé©ç¨ããã¦ããªãããã¯ã¹ãã£ã®ãªãã½ãªãããªãã¸ã§ã¯ããæç»ãã¦ãããããããã¯ã¨ã¦ãç°¡åã§ãã
<script id="fragment-shader" type="x-shader/x-fragment">
#ifdef GL_ES
precision highp float;
#endif
uniform vec4 uGlobalColor;
void main() {
gl_FragColor = uGlobalColor;
}
</script>
ããã¯å¿
è¦ã«å¿ã㦠float
åã®ç²¾åº¦ãæå®ãããã¨ããå§ã¾ãã¾ããæ¬¡ã«ãã°ãã¼ãã«å¤æ° gl_FragColor
㸠uniform 修飾åä»ãã® uGlobalColor
ã®å¤ãè¨å®ãã¾ããããã¯ãJavaScript ã³ã¼ãã«ããæ£æ¹å½¢ã®æç»ã«ä½¿ç¨ãããè²ã«è¨å®ããã¾ãã
HTML ã¯ãWebGL ã³ã³ããã¹ããåå¾ãã <canvas>
ã®ã¿ã§æ§æããã¦ãã¾ãã
<canvas id="glcanvas" width="600" height="460">
Oh no! Your browser doesn't support canvas!
</canvas>
ã°ãã¼ãã«å¤æ°ã¨åæå
ã¾ããã°ãã¼ãã«å¤æ°ãããã§ã¯ãããã«ã¤ãã¦ã¯èª¬æãã¾ããã代ããã«ãä»å¾ã®ã³ã¼ãã§ä½¿ç¨ãããå ´åã«ã¤ãã¦èª¬æãã¾ãã
let gl = null;
let glCanvas = null;
// Aspect ratio and coordinate system
// details
let aspectRatio;
let currentRotation = [0, 1];
let currentScale = [1.0, 1.0];
// Vertex information
let vertexArray;
let vertexBuffer;
let vertexNumComponents;
let vertexCount;
// Rendering data shared with the
// scalers.
let uScalingFactor;
let uGlobalColor;
let uRotationVector;
let aVertexPosition;
// Animation timing
let previousTime = 0.0;
let degreesPerSecond = 90.0;
ããã°ã©ã ã®åæå㯠startup()
ã¨å¼ã°ãã load
ã¤ãã³ããã³ãã©ã¼ã«ãã£ã¦å¦çãã¾ãã
window.addEventListener("load", startup, false);
function startup() {
glCanvas = document.getElementById("glcanvas");
gl = glCanvas.getContext("webgl");
const shaderSet = [
{
type: gl.VERTEX_SHADER,
id: "vertex-shader",
},
{
type: gl.FRAGMENT_SHADER,
id: "fragment-shader",
},
];
shaderProgram = buildShaderProgram(shaderSet);
aspectRatio = glCanvas.width / glCanvas.height;
currentRotation = [0, 1];
currentScale = [1.0, aspectRatio];
vertexArray = new Float32Array([
-0.5, 0.5, 0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5, -0.5, -0.5,
]);
vertexBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, vertexArray, gl.STATIC_DRAW);
vertexNumComponents = 2;
vertexCount = vertexArray.length / vertexNumComponents;
currentAngle = 0.0;
animateScene();
}
WebGL ã³ã³ããã¹ã gl
ãåå¾ããã·ã§ã¼ãã¼ããã°ã©ã ãæ§ç¯ãããã¨ããå§ããå¿
è¦ãããã¾ããããã§ã¯ãããã°ã©ã ã«è¤æ°ã®ã·ã§ã¼ãã¼ãã¨ã¦ãç°¡åã«è¿½å ã§ããããã«è¨è¨ãããã³ã¼ãã使ç¨ãã¦ãã¾ããé
å shaderSet
ã«ã¯ãªãã¸ã§ã¯ãã®ãªã¹ããå«ã¾ããåãªãã¸ã§ã¯ãã¯ããã°ã©ã ã«ã³ã³ãã¤ã«ããã 1 ã¤ã®ã·ã§ã¼ãã¼é¢æ°ãè¨è¿°ãã¦ãã¾ããå颿°ã«ã¯ãã¿ã¤ã (gl.VERTEX_SHADER
ã¾ã㯠gl.FRAGMENT_SHADER
ã®ãããã) 㨠ID (ã·ã§ã¼ãã¼ã®ã³ã¼ããå«ã <script>
è¦ç´ ã® ID) ã®ä¸¡æ¹ãããã¾ãã
ã·ã§ã¼ãã¼ã»ãã㯠buildShaderProgram()
颿°ã«æ¸¡ãããã³ã³ãã¤ã«ãããªã³ã¯ãããã·ã§ã¼ãã¼ããã°ã©ã ãè¿ãã¾ããæ¬¡ã«ãããã©ã®ããã«æ©è½ããããè¦ã¦ããã¾ãã
ã·ã§ã¼ãã¼ããã·ã§ã°ã©ã ãæ§ç¯ããå¹
ãé«ãã§å²ã£ã¦ããã³ã³ããã¹ãã®ã¢ã¹ãã¯ãæ¯ãè¨ç®ãã¾ããæ¬¡ã«ãã¢ãã¡ã¼ã·ã§ã³ã®ç¾å¨ã®å転ãã¯ãã«ã [0, 1]
ã«è¨å®ããã¹ã±ã¼ãªã³ã°ãã¯ãã«ã [1.0, aspectRatio]
ã«è¨å®ãã¾ããé ç¹ã·ã§ã¼ãã¼ã§è¦ãã¹ã±ã¼ãªã³ã°ãã¯ãã«ã¯ã-1.0 ãã 1.0 ã®ç¯å²ã«åãããã«åº§æ¨ãã¹ã±ã¼ãªã³ã°ããããã«ä½¿ç¨ããã¾ãã
次ã«é ç¹ã®é
åã Float32Array
ã¨ãã¦ä½æãããä¸è§å½¢ãã¨ã« 6 ã¤ã®åº§æ¨ (3 ã¤ã® 2D é ç¹) ãæç»ãããåè¨ 12 åã®å¤ã使ããã¾ãã
ã覧ã®ã¨ãããå軸㫠-1.0 ã 1.0 ã®åº§æ¨ç³»ã使ç¨ãã¦ãã¾ãããªã調æ´ããå¿ è¦ãããã®ã§ããããï¼ããã¯åã«ã³ã³ããã¹ããæ£æ¹å½¢ã§ã¯ãªãããã§ããå¹ 600 ãã¯ã»ã«ãé«ã 460 ã®ã³ã³ããã¹ãã使ç¨ãã¦ãã¾ãããããã®åãã£ã¡ã³ã·ã§ã³ã¯ã-1.0 ã 1.0 ã®ç¯å²ã«ãããã³ã°ããã¾ãã2 ã¤ã®è»¸ã¯åãé·ãã§ã¯ãªãããã2 ã¤ã®è»¸ã®ããããã®å¤ã調æ´ããªãã¨ãæ£æ¹å½¢ã¯ä¸æ¹ã¾ãã¯ä»æ¹ã«å¼ã伸ã°ããã¾ãããããã£ã¦ããããã®å¤ãæ£è¦åããå¿ è¦ãããã¾ãã
é ç¹é
åã使ãããããgl.createBuffer()
ãå¼ã³åºããããããå«ãæ°ãã GL ãããã¡ã¼ã使ãã¾ããgl.bindBuffer()
ãå¼ã³åºãã¦æ¨æºã® WebGL é
åãããã¡ã¼åç
§ããã¤ã³ãããgl.bufferData()
ã使ç¨ãã¦é ç¹ãã¼ã¿ããããã¡ã¼ã«ã³ãã¼ãã¾ããgl.STATIC_DRAW
ã®ä½¿ç¨æ³ãæå®ããã¦ããããã¼ã¿ã¯ 1 åã ãè¨å®ããã夿´ããããã¨ã¯ããã¾ããããç¹°ãè¿ã使ç¨ããããã¨ã WebGL ã«ä¼ãã¾ããããã«ãããWebGL ã¯ããã®æ
å ±ã«åºã¥ãã¦ããã©ã¼ãã³ã¹ãåä¸ãããå¯è½æ§ã®ãããé©ç¨å¯è½ãªæé©åãæ¤è¨ãã¾ãã
WebGL ã«æä¾ãããé ç¹ãã¼ã¿ã使ç¨ãã¦ãvertexNumComponents
ãåé ç¹ã®ã³ã³ãã¼ãã³ãã®æ° (2D é ç¹ã§ãããã 2) ã«è¨å®ããvertexCount
ãé ç¹ãªã¹ãã®é ç¹ã®æ°ã«è¨å®ãã¾ãã
次ã«ãã¾ã å転ãå®è¡ãã¦ããªããããç¾å¨ã®å転è§åº¦ (度) ã 0.0 ã«è¨å®ããå転é度 (ç»é¢ã®æ´æ°æéãã¨ã®åº¦ãé常 60 FPS) ã 6 ã«è¨å®ãã¾ãã
æå¾ã«ãanimateScene()
ãå¼ã³åºããã¦ãæåã®ãã¬ã¼ã ãã¬ã³ããªã³ã°ããã¢ãã¡ã¼ã·ã§ã³ã®æ¬¡ã®ãã¬ã¼ã ã®ã¬ã³ããªã³ã°ãã¹ã±ã¸ã¥ã¼ã«ãã¾ãã
buildShaderProgram()
颿°ã¯ãã·ã§ã¼ãã¼ããã°ã©ã ã«ã³ã³ãã¤ã«ããã³ãªã³ã¯ãããã·ã§ã¼ãã¼é¢æ°ã®ã»ãããè¨è¿°ãããªãã¸ã§ã¯ãã®é
åãå
¥åã¨ãã¦åãåãããã«ãããã³ãªã³ã¯å¾ã«ã·ã§ã¼ãã¼ããã°ã©ã ãè¿ãã¾ãã
function buildShaderProgram(shaderInfo) {
const program = gl.createProgram();
shaderInfo.forEach((desc) => {
const shader = compileShader(desc.id, desc.type);
if (shader) {
gl.attachShader(program, shader);
}
});
gl.linkProgram(program);
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
console.log("Error linking shader program:");
console.log(gl.getProgramInfoLog(program));
}
return program;
}
ã¾ããgl.createProgram()
ã¯æ°ãã空㮠GLSL ããã°ã©ã ã使ããããã«å¼ã³åºããã¾ãã
次ã«ãæå®ãããã·ã§ã¼ãã¼ã®ãªã¹ãå
ã®åã·ã§ã¼ãã¼ã«å¯¾ãã¦ãcompileShader()
颿°ãå¼ã³åºãã¦ã³ã³ãã¤ã«ãããã«ãããã·ã§ã¼ãã¼é¢æ°ã® ID ã¨ã¿ã¤ããæ¸¡ãã¾ããåè¿°ã®ããã«ããããã®åãªãã¸ã§ã¯ãã«ã¯ãã·ã§ã¼ãã¼ã³ã¼ããåå¨ãã <script>
è¦ç´ ã® ID ã¨ã·ã§ã¼ãã¼ã®ã¿ã¤ããå«ã¾ãã¾ããã³ã³ãã¤ã«ãããã·ã§ã¼ãã¼ã¯ãgl.attachShader()
ã¸æ¸¡ããã¨ã§ã·ã§ã¼ãã¼ããã°ã©ã ã«ã¢ã¿ããããã¾ãã
ã¡ã¢: å®éã«ã¯ãããããããã«ä¸æ©é²ãã§ã<script>
è¦ç´ ã® type
屿§ã®å¤ãè¦ã¦ãã·ã§ã¼ãã¼ã®ã¿ã¤ãã夿ã§ãã¾ãã
ãã¹ã¦ã®ã·ã§ã¼ãã¼ãã³ã³ãã¤ã«ãããã¨ãgl.linkProgram()
ã使ç¨ãã¦ããã°ã©ã ããªã³ã¯ããã¾ãã
ããã°ã©ã ã®ãªã³ã¯ä¸ã«ã¨ã©ã¼ãçºçããå ´åãã¨ã©ã¼ã¡ãã»ã¼ã¸ã¯ã³ã³ã½ã¼ã«ã«è¨é²ããã¾ãã
æå¾ã«ãã³ã³ãã¤ã«ãããããã°ã©ã ãå¼ã³åºãå ã«è¿ããã¾ãã
åã ã®ã·ã§ã¼ãã¼ãã³ã³ãã¤ã«ãã以ä¸ã® compileShader()
颿°ã¯ãåä¸ã®ã·ã§ã¼ãã¼ãã³ã³ãã¤ã«ããããã« buildShaderProgram()
ã«ãã£ã¦å¼ã³åºããã¾ãã
function compileShader(id, type) {
const code = document.getElementById(id).firstChild.nodeValue;
const shader = gl.createShader(type);
gl.shaderSource(shader, code);
gl.compileShader(shader);
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
console.log(
`Error compiling ${
type === gl.VERTEX_SHADER ? "vertex" : "fragment"
} shader:`,
);
console.log(gl.getShaderInfoLog(shader));
}
return shader;
}
ã³ã¼ãã¯æå®ããã ID ãæã¤ <script>
è¦ç´ å
ã«å«ã¾ããããã¹ããã¼ãã®å¤ãåå¾ãããã¨ã«ãããHTML ããã¥ã¡ã³ãããåå¾ããã¾ããæ¬¡ã« gl.createShader()
ã使ç¨ãã¦ãæå®ãããã¿ã¤ãã®æ°ããã·ã§ã¼ãã¼ã使ããã¾ãã
ã½ã¼ã¹ã³ã¼ã㯠gl.shaderSource()
ãéãã¦æ°ããã·ã§ã¼ãã¼ã«éä¿¡ããããã®ã¨ãã·ã§ã¼ãã¼ã¯ gl.compileShader()
ã使ç¨ãã¦ã³ã³ãã¤ã«ããã¾ãã
ã³ã³ãã¤ã«ã¨ã©ã¼ã¯ã³ã³ã½ã¼ã«ã«è¨é²ããã¾ããçæãããã¡ãã»ã¼ã¸ã«æ£ããã·ã§ã¼ãã¼ã¿ã¤ãã®æååãæ¿å
¥ããããã®ãã³ãã¬ã¼ããªãã©ã«æååã®ä½¿ç¨ã«æ³¨æãã¦ãã ãããå®éã®ã¨ã©ã¼ã®è©³ç´°ã¯ãgl.getShaderInfoLog()
ãå¼ã³åºããã¨ã«ãã£ã¦åå¾ããã¾ãã
æå¾ã«ãã³ã³ãã¤ã«ãããã·ã§ã¼ãã¼ãå¼ã³åºãå
(buildShaderProgram()
颿°) ã¸è¿ãã¾ãã
animateScene()
颿°ã¯åã¢ãã¡ã¼ã·ã§ã³ãã¬ã¼ã ãã¬ã³ããªã³ã°ããããã«å¼ã³åºããã¾ãã
function animateScene() {
gl.viewport(0, 0, glCanvas.width, glCanvas.height);
gl.clearColor(0.8, 0.9, 1.0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);
const radians = (currentAngle * Math.PI) / 180.0;
currentRotation[0] = Math.sin(radians);
currentRotation[1] = Math.cos(radians);
gl.useProgram(shaderProgram);
uScalingFactor = gl.getUniformLocation(shaderProgram, "uScalingFactor");
uGlobalColor = gl.getUniformLocation(shaderProgram, "uGlobalColor");
uRotationVector = gl.getUniformLocation(shaderProgram, "uRotationVector");
gl.uniform2fv(uScalingFactor, currentScale);
gl.uniform2fv(uRotationVector, currentRotation);
gl.uniform4fv(uGlobalColor, [0.1, 0.7, 0.2, 1.0]);
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
aVertexPosition = gl.getAttribLocation(shaderProgram, "aVertexPosition");
gl.enableVertexAttribArray(aVertexPosition);
gl.vertexAttribPointer(
aVertexPosition,
vertexNumComponents,
gl.FLOAT,
false,
0,
0,
);
gl.drawArrays(gl.TRIANGLES, 0, vertexCount);
requestAnimationFrame((currentTime) => {
const deltaAngle =
((currentTime - previousTime) / 1000.0) * degreesPerSecond;
currentAngle = (currentAngle + deltaAngle) % 360;
previousTime = currentTime;
animateScene();
});
}
ã¢ãã¡ã¼ã·ã§ã³ã®ãã¬ã¼ã ãæç»ããããã«æåã«è¡ãå¿
è¦ãããã®ã¯ãèæ¯ãç®çã®è²ã«ã¯ãªã¢ãããã¨ã§ãããã®å ´åã<canvas>
ã®ãµã¤ãºã«åºã¥ãã¦ãã¥ã¼ãã¼ããè¨å®ããclearColor()
ãå¼ã³åºãã¦ä½¿ç¨ããè²ãè¨å®ãã¾ããã³ã³ãã³ããã¯ãªã¢ããã¨ããclear()
ã§ãããã¡ã¼ãã¯ãªã¢ãã¾ãã
次ã«ãç¾å¨ã®å転ãã¯ãã«ã¯ãç¾å¨ã®å転è§åº¦ (currentAngle
) ãã©ã¸ã¢ã³ã«å¤æããå転ãã¯ãã«ã®æåã®ã³ã³ãã¼ãã³ãã sin ã¸è¨å®ãã2 çªç®ã®ã³ã³ãã¼ãã³ãã cos ã¸è¨å®ãã¾ããcurrentRotation
ãã¯ãã«ã¯ãç¾å¨ã®è§åº¦ currentAngle
ã«ããåä½åä¸ã®ç¹ã®ä½ç½®ã§ãã
useProgram()
ã¯ã以åã«ç¢ºç«ãã GLSL ã·ã§ã¼ãã£ã³ã°ããã°ã©ã ãã¢ã¯ãã£ãã«ããããã«å¼ã³åºããã¾ããæ¬¡ã«ãJavaScript ã³ã¼ãã¨ã·ã§ã¼ãã¼é (getUniformLocation()
ã使ç¨) ã§æ
å ±ãå
±æããããã«ä½¿ç¨ãããå uniform ã®ä½ç½®ãåå¾ãã¾ãã
uScalingFactor
ã¨ããååã® uniform ã¯ã以åã«è¨ç®ããã currentScale
å¤ã«è¨å®ããã¾ããè¦ãã¦ããããããã¾ããããããã¯ã³ã³ããã¹ãã®ã¢ã¹ãã¯ãæ¯ã«åºã¥ãã¦åº§æ¨ç³»ã調æ´ããããã«ä½¿ç¨ãããå¤ã§ãããã㯠uniform2fv()
ã使ç¨ãã¦è¡ããã¾ã (ãã㯠2 å¤ã®æµ®åå°æ°ç¹ãã¯ãã«ã§ãããã)ã
uRotationVector
ã¯ãåãã uniform2fv()
ã使ç¨ãã¦ãç¾å¨ã®å転ãã¯ãã« (currentRotation
) ã«è¨å®ããã¾ãã
uGlobalColor
㯠uniform4fv()
ã使ç¨ãã¦ãæ£æ¹å½¢ãæç»ããã¨ãã«ä½¿ç¨ããè²ã«è¨å®ããã¾ãããã㯠4 ã³ã³ãã¼ãã³ãã®æµ®åå°æ°ç¹ãã¯ãã«ã§ã (赤ãç·ãéãããã³ã¢ã«ãã¡ãã¨ã« 1 ã¤ã®ã³ã³ãã¼ãã³ã)ã
ããã§ãã¹ã¦ãçµã£ãã®ã§ãé ç¹ãããã¡ã¼ãè¨å®ãã¦å½¢ç¶ãæç»ã§ãã¾ããã¾ããbindBuffer()
ãå¼ã³åºããã¨ã«ãããå½¢ç¶ã®ä¸è§å½¢ã®æç»ã«ä½¿ç¨ãããé ç¹ã®ãããã¡ã¼ãè¨å®ãã¾ããæ¬¡ã«ãgetAttribLocation()
ãå¼ã³åºãã¦ãã·ã§ã¼ãã¼ããã°ã©ã ããé ç¹ä½ç½®å±æ§ã®ã¤ã³ããã¯ã¹ãåå¾ãã¾ãã
é ç¹ä½ç½®å±æ§ã®ã¤ã³ããã¯ã¹ã aVertexPosition
ã§å©ç¨å¯è½ã«ãªã£ãã®ã§ãenableVertexAttribArray()
ãå¼ã³åºãã¦ä½ç½®å±æ§ãæå¹ã«ããã·ã§ã¼ãã¼ããã°ã©ã (ç¹ã«é ç¹ã·ã§ã¼ãã¼) ã§ä½¿ç¨ã§ããããã«ãã¾ãã
次ã«ãvertexAttribPointer()
ãå¼ã³åºããã¨ã«ãããé ç¹ãããã¡ã¼ã aVertexPosition
屿§ã«ãã¤ã³ãããã¾ãããã®ã¹ãããã¯ã»ã¨ãã©å¯ä½ç¨ã§ããããããã®ã¹ãããã¯æããã§ã¯ããã¾ããããã ããçµæã¨ãã¦ãaVertexPosition
ã«ã¢ã¯ã»ã¹ããã¨ãé ç¹ãããã¡ã¼ãããã¼ã¿ãåå¾ããããã«ãªãã¾ãã
ã·ã§ã¤ãã®é ç¹ãããã¡ã¼ã¨é ç¹ã 1 ã¤ãã¤é ç¹ã·ã§ã¼ãã¼ã«é
ä¿¡ããããã«ä½¿ç¨ããã aVertexPosition
屿§ã¨ã®éã«é¢é£ä»ããããã°ãdrawArrays()
ãå¼ã³åºãã¦ã·ã§ã¤ããæç»ããæºåãæ´ãã¾ãã
ãã®æç¹ã§ããã¬ã¼ã ãæç»ããã¾ããããã¨ã¯ãæ¬¡ã®æç»ãã¹ã±ã¸ã¥ã¼ã«ããã ãã§ããããã§ã¯ requestAnimationFrame()
ãå¼ã³åºãã¦ããã©ã¦ã¶ã¼ãç»é¢ãæ´æ°ããæºåãã§ããã¨ãã«ã³ã¼ã«ããã¯é¢æ°ãå®è¡ããããã«è¦æ±ãã¾ãã
requestAnimationFrame()
ã³ã¼ã«ããã¯ã¯ããã¬ã¼ã æç»ãéå§ãããæéãæå®ããåä¸ã®ãã©ã¡ã¼ã¿ã¼ currentTime
ãå
¥åã¨ãã¦åãåãã¾ããããã¨ãæå¾ã®ãã¬ã¼ã ãæç»ãããä¿åæéãpreviousTime
ãããã³æ£æ¹å½¢ãå転ãã 1 ç§ãããã®åº¦æ° (degreesPerSecond
) ã使ç¨ãã¦ãcurrentAngle
ã®æ°ããå¤ãè¨ç®ãã¾ããæ¬¡ã«ãpreviousTime
ã®å¤ãæ´æ°ãããanimateScene()
ãå¼ã³åºãã¦æ¬¡ã®ãã¬ã¼ã ãæç»ãã¾ã (ããã¦ã次ã®ãã¬ã¼ã ãæç»ãããããã«ç¡éã«ã¹ã±ã¸ã¥ã¼ã«ãã¾ã )ã
ãã㯠1 ã¤ã®åç´ãªãªãã¸ã§ã¯ããæç»ãã¦ããã ãã®ã¨ã¦ãåç´ãªä¾ã§ãããããã§ä½¿ç¨ããã¦ããæ¦å¿µã¯ã¯ããã«è¤éãªã¢ãã¡ã¼ã·ã§ã³ã«æ¡å¼µããã¾ãã
é¢é£æ å ±RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4