å§ãã« WebGL ã«ã¤ãã¦çè§£ãã¹ããã¨ã¯ãããåºã OpenGL æ¨æºã¨ã¯ç°ãªããWebGL ã¯ã©ã¤ãã£ã³ã°ããµãã¼ããã¦ããªãã¨ãããã¨ã§ããããã¯èªåèªèº«ã§è¡ãå¿ è¦ãããã¾ãã幸ãããã¯é£ãããã¨ã§ã¯ããã¾ããã®ã§ããã®è¨äºã§ã¯åºç¤çãªå å®¹ãæ±ãã¾ãã
3D ã®ã©ã¤ãã£ã³ã°ã¨ã·ã§ã¼ãã£ã³ã°ãã·ãã¥ã¬ã¼ããã3D ã°ã©ãã£ãã¯ã«ãããã·ãã¥ã¬ã¼ããããã©ã¤ãã£ã³ã°ã®çè«ã«è©³ãã触ããã®ã¯ãã®è¨äºã®ç¯å²ã大ããè¶ ãã¾ããããã®åããç¥ãã®ã«å½¹ç«ã¡ã¾ããããã§ã¯æ·±ã触ãã¾ããã®ã§è©³ããã¯ããã使ãããã©ã¤ãã£ã³ã°ã¢ãã«ã«ã¤ãã¦è§£èª¬ãã¦ãã Wikipedia ã® Phong shading (æ¥æ¬èªç) ã®è¨äºãã覧ãã ããã
ã©ã¤ãã£ã³ã°ã«ã¯ 3 種é¡ã®åºæ¬ã¿ã¤ããããã¾ãã
ç°å¢å ã¯ç°å¢å ¨ä½ã«å½ããå ã§ããããã¯æåæ§ããªããç°å¢å ã®è¡¨é¢ã«å¯¾ãã¦ããã®åãã«é¢ä¿ãªãåçã«å¹æãä¸ãã¾ãã
æåæ§å æº ã¯ç¹å®ã®æ¹åããæå°ãããå æºã§ããããã¯é æ¹ããç §ããããå æºã§ããããã¹ã¦ã®å ç·ã¯ãäºãå¹³è¡ã«å±ãã¾ããä¾ãã°å¤ªé½å ãæåæ§å æºã«ãªãã¾ãã
ç¹å æº ã¯ããä¸ç¹ããå ¨æ¹åã«åãã£ã¦æå°ãããå æºã§ããããã¯ç¾å®ã«ããå¤ãã®å æºã®é常åä½ã§ããä¾ãã°ãé»çã¯å ¨æ¹åã«å ãæå°ãã¾ãã
ä»åã¯ãåç´ãªæåæ§å æºã¨ç°å¢å ã®ã¿ãèæ ®ãããã¨ã§ã©ã¤ãã£ã³ã°ã¢ãã«ãåç´åãã¾ããåå°å ãç¹å æºã¯æ±ãã¾ãããããã¦ãç°å¢å 㨠1 ã¤ã®æåæ§å æºãåã®ãã¢ã®å転ãããã¥ã¼ãã«å½ã¦ã¾ãã
ç¹å æºã¨åå°å ã®æ¦å¿µãå¤ãããã¨ã«ãããæåæ§å æºãå®è£ ããããã«å¿ è¦ãªæ å ±ã¯ä»¥ä¸ã® 2 ç¹ã«ãªãã¾ã:
ããã¦ãã¼ããã¯ã¹ã·ã§ã¼ãã¼ããç°å¢å ããã³è¡¨é¢ã«å½ãã£ãè§åº¦ã«ããæåæ§å æºã®å¹æãèæ ®ãã¦åé ç¹ã®è²ã調æ´ããããã«æ´æ°ãã¾ããã·ã§ã¼ãã¼ã®ã³ã¼ããè¦ã¦ãã©ã¤ãã£ã³ã°ãè¡ãæ¹æ³ãè¦ã¦ããã¾ãããã
é ç¹ã®æ³ç·ãæ§ç¯ããå§ãã«è¡ãã¹ããã¨ã¯ããã¥ã¼ããæ§æããå ¨é ç¹ã®æ³ç·ã®é åã使ãããã¨ã§ãããã¥ã¼ãã¯åç´ãªãªãã¸ã§ã¯ãã§ãã®ã§ãããã¯ç°¡åã«ã§ãã¾ããããè¤éãªãªãã¸ã§ã¯ãã®å ´åã¯ãæããã«æ³ç·ã®è¨ç®ãé£ãããªãã¾ãã
cubeVerticesNormalBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, cubeVerticesNormalBuffer);
var vertexNormals = [
// åé¢
0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0,
// èé¢
0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0,
// ä¸é¢
0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0,
// åºé¢
0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0,
// å³å´é¢
1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0,
// å·¦å´é¢
-1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0,
];
gl.bufferData(
gl.ARRAY_BUFFER,
new WebGLFloatArray(vertexNormals),
gl.STATIC_DRAW,
);
ããã¯ãä»ã§ã¯ããè¦æ
£ãããã®ã§ããããæ°ãããããã¡ã使ããããã使¥ç¨ã®é
åã«ãã¤ã³ããã¾ããããã¦ãbufferData()
ãå¼ã³åºãã¦é ç¹ã®æ³ç·ã®é
åããããã¡ã«éãè¾¼ã¿ã¾ãã
次ã«ãæ³ç·ã®é
åãã·ã§ã¼ãã¼ã®å±æ§ã«ãã¤ã³ããã¦ãã·ã§ã¼ãã¼ã®ã³ã¼ãããã®é
åã«ã¢ã¯ã»ã¹ã§ããããã«ããããã®ã³ã¼ãã drawScene()
ã«è¿½å ãã¾ã:
gl.bindBuffer(gl.ARRAY_BUFFER, cubeVerticesNormalBuffer);
gl.vertexAttribPointer(vertexNormalAttribute, 3, gl.FLOAT, false, 0, 0);
æå¾ã«ãã·ã§ã¼ãã¼ã«å¯¾ã㦠æ£è¦è¡å ãçæãã¦æ¸¡ãããã®ã䏿§ãªè¡åãæ§ç¯ããã³ã¼ããæ´æ°ããå¿ è¦ãããã¾ããããã¯ãå æºã«é¢ãããã¥ã¼ãã®ç¾å¨ã®åããå¦çããéã«æ³ç·ã夿ããã®ã«ä½¿ç¨ããã¾ã:
var normalMatrix = mvMatrix.inverse();
normalMatrix = normalMatrix.transpose();
var nUniform = gl.getUniformLocation(shaderProgram, "uNormalMatrix");
gl.uniformMatrix4fv(
nUniform,
false,
new WebGLFloatArray(normalMatrix.flatten()),
);
ã·ã§ã¼ãã¼ãæ´æ°ãã
ã·ã§ã¼ãã¼ãå¿ è¦ã¨ãããã¼ã¿ããã¹ã¦ç¨æã§ãã¾ããã®ã§ã次ã¯ã·ã§ã¼ãã¼ã®ã³ã¼ããæ´æ°ããå¿ è¦ãããã¾ãã
ãã¼ããã¯ã¹ã·ã§ã¼ãã¼ã¾ãã¯ãã¼ããã¯ã¹ã·ã§ã¼ãã¼ããç°å¢å ããã³æåæ§å æºã«åºã¥ãã¦åé ç¹ã®ã·ã§ã¼ãã£ã³ã°å¤ãçæããããã«æ´æ°ãã¾ãã以ä¸ã®ã³ã¼ããã覧ãã ãã:
<script id="shader-vs" type="x-shader/x-vertex">
attribute highp vec3 aVertexNormal;
attribute highp vec3 aVertexPosition;
attribute highp vec2 aTextureCoord;
uniform highp mat4 uNormalMatrix;
uniform highp mat4 uMVMatrix;
uniform highp mat4 uPMatrix;
varying highp vec2 vTextureCoord;
varying highp vec3 vLighting;
void main(void) {
gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);
vTextureCoord = aTextureCoord;
// ã©ã¤ãã£ã³ã°å¹æãé©ç¨ãã
highp vec3 ambientLight = vec3(0.6, 0.6, 0.6);
highp vec3 directionalLightColor = vec3(0.5, 0.5, 0.75);
highp vec3 directionalVector = vec3(0.85, 0.8, 0.75);
highp vec4 transformedNormal = uNormalMatrix * vec4(aVertexNormal, 1.0);
highp float directional = max(dot(transformedNormal.xyz, directionalVector), 0.0);
vLighting = ambientLight + (directionalLightColor * directional);
}
</script>
é ç¹ã®ä½ç½®ãç®åºãããã¨ãé ç¹ã«å¯¾å¿ãããã¯ã»ã«ã®åº§æ¨ãç®åºãããé ç¹ã®ã·ã§ã¼ãã£ã³ã°ã®è¨ç®ãã§ããããã«ãªãã¾ãã
å§ãã«è¡ãã®ã¯ãé ç¹ã®æ³ç·ã«æ£è¦è¡åãä¹ãããã¨ã§ãæ³ç·ãç¾å¨ã®ãã¥ã¼ãã®åãã¨ä½ç½®ã«åºã¥ããã®ã«å¤æãããã¨ã§ããæ¬¡ã«ã夿ãããæ³ç·ã¨æ¹åãã¯ãã« (å ç·ãæ¥ãæ¹å) ã®ç¹ä¹ç©ãè¨ç®ãããã¨ã«ãããé ç¹ã«é©ç¨ãããã¹ãæåæ§å æºã®å éãç®åºãããã¨ãã§ãã¾ããå éã 0 ããå°ãããããã¨ã¯ã§ãã¾ããã®ã§ãç®åºçµæã 0 ããå°ãããªã£ãå ´åã¯ããã®å¤ã 0 ã«åºå®ãã¾ãã
æåæ§å æºã®å éãç®åºãããããç°å¢å ãåãè¾¼ã¿ããã«æåæ§å æºã®è²ã¨å éãè¶³ãè¾¼ããã¨ã§ã©ã¤ãã£ã³ã°ã®å¤ã決ãããã¨ãã§ãã¾ãããã®çµæããã©ã°ã¡ã³ãã·ã§ã¼ãã¼ãæç»ããåãã¯ã»ã«ã®è²ã調æ´ããããã«ç¨ãã RGB å¤ãå¾ããã¨ãã§ãã¾ãã
ãã©ã°ã¡ã³ãã·ã§ã¼ãã¼ãã©ã°ã¡ã³ãã·ã§ã¼ãã¼ã¯ããã¼ããã¯ã¹ã·ã§ã¼ãã¼ãç®åºããå éã®å¤ãèæ ®ããããã«æ´æ°ããå¿ è¦ãããã¾ã:
<script id="shader-fs" type="x-shader/x-fragment">
varying highp vec2 vTextureCoord;
varying highp vec3 vLighting;
uniform sampler2D uSampler;
void main(void) {
mediump vec4 texelColor = texture2D(uSampler, vec2(vTextureCoord.s, vTextureCoord.t));
gl_FragColor = vec4(texelColor.rgb * vLighting, texelColor.a);
}
</script>
ããã§ã¯ä»¥åã®ä¾ã§è¡ã£ãããã«ãã¯ã»ã«ã®è²ãåãåºãã¾ããããã©ã°ã¡ã³ãã®è²ãè¨å®ããåã«ãå æºã®å½±é¿ãèæ ®ãã¦ãã¯ã»ã«ã®è²ã調æ´ããããããã¯ã»ã«ã®è²ã«å éã®å¤ãæãåããã¾ãã
以ä¸ã§å®æã§ã!
ã³ã¼ãã確èªãã | æ°ãããã¼ã¸ã§ãã¢ãéã
èªè ã¸ã®èª²é¡åºæ¬çãªé ç¹ãã¨ã®ã©ã¤ãã£ã³ã°ãå®è£ ããä»åã®ä¾ã¯ãåç´ãªãã®ã§ãããã¨ã¯æããã§ããããé«åº¦ãªã°ã©ãã£ãã¯ã¨ãã¦ãã¯ã»ã«ãã¨ã®ã©ã¤ãã£ã³ã°ãå®è£ ãããã¨èããã®ã¯ãæ£ããæ¹åæ§ã§ãã
åæ§ã«ãå æºã®æ¹åãå æºã®è²ãªã©ã«ã¤ãã¦ãå®é¨ãã¦ã¿ãã¨ããã§ãããã
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