- 浏览: 40966 次
- 性别:
- 来自: 北京
最新评论
首先,我们有个名词:“渲染器”
渲染器是这样一些代码,在一个场景开始绘制之前,它能对场景的任何部分做任何处理。这的确十分有用,由于它运行在图形卡上,所以它能很快运行且能很便利地做各种变换。
渲染器运行在图形卡上获得WebGL系统,它把模型视图矩阵和投影矩阵应用到场景中,而不需要使用相对较慢的JavaScript来移动场景中的每一个点和每一个三角形顶点。这相当有用并且值得额外的开销。
下面我们来看一个简单的例子:
function initShaders() {
var fragmentShader = getShader(gl, "shader-fs");//获取片段渲染器
var vertexShader = getShader(gl, "shader-vs");//获取顶点渲染器
shaderProgram = gl.createProgram();//创建渲染器对象
gl.attachShader(shaderProgram, vertexShader);//绑定顶点渲染器
gl.attachShader(shaderProgram, fragmentShader);//绑定片段渲染器
gl.linkProgram(shaderProgram);//和webGL关联shaderProgram
if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
alert("Could not initialise shaders");
}
gl.useProgram(shaderProgram);//告诉webGLass使用shaderProgram
shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition");//获取属性vertexPositionAttribute
gl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute);//使能
shaderProgram.pMatrixUniform = gl.getUniformLocation(shaderProgram, "uPMatrix");//获取属性pMatrixUniform
shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix");//获取属性pMatrixUniform
}
至此,初始化渲染器完成。其中有个自定义函数,需要特别解释:
/**
*这是一个比看起来要简单的函数。我们要做的是在HTML网页中寻找一个元素,其具有与传入参数匹配的ID,取出其内容并基于其类型创建一个片段渲染器或者一个顶点渲染器(以后我们将更多地解释它们的区别),接着将其传入到WebGL中编译成可以在图形卡上运行的形式。接下来,代码进行出错处理,最后完成整个处理。当然,我们只能在JavaScript中将渲染器定义为字符串而不能从HTML中提取——通过这样做,我们使其更易读,因为它们被定义为网页中的脚本,就像它们本身就是JavaScript一样.
事实上,他动态的创建了渲染器语言编写的代码,推送给图形显卡执行,它们使
用一种特殊的与C语言有很大关系的渲染器语言所写。
*/
function getShader(gl, id) {
var shaderScript = document.getElementById(id);
if (!shaderScript) {
return null;
}
var str = "";
var k = shaderScript.firstChild;
while (k) {
if (k.nodeType == 3) {
str += k.textContent;
}
k = k.nextSibling;
}
alert(str);
var shader;
if (shaderScript.type == "x-shader/x-fragment") {
shader = gl.createShader(gl.FRAGMENT_SHADER);
} else if (shaderScript.type == "x-shader/x-vertex") {
shader = gl.createShader(gl.VERTEX_SHADER);
} else {
return null;
}
gl.shaderSource(shader, str);
gl.compileShader(shader);
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
alert(gl.getShaderInfoLog(shader));
return null;
}
return shader;
}
至此,创建渲染器对象完成,(实际上他实在拼接渲染器代码之后,和webGL绑定的)。
最后,贴上完整的JS代码,如果不出意外(当然HTML自己写)页面上就能看见三角形和正方形了(合适的浏览器):
<script type="text/javascript" src="glMatrix-0.9.5.min.js"></script>
<script id="shader-fs" type="x-shader/x-fragment">
precision mediump float;
void main(void) {
gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}
</script>
<script id="shader-vs" type="x-shader/x-vertex">
attribute vec3 aVertexPosition;
uniform mat4 uMVMatrix;
uniform mat4 uPMatrix;
void main(void) {
gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);
}
</script>
<script type="text/javascript" charset="UTF-8">
var gl;
var triangleVertexPositionBuffer;
var squareVertexPositionBuffer;
var shaderProgram;//渲染器对象
var mvMatrix = mat4.create();//模型矩阵
/**
mat4.create=function(a){
var b=new glMatrixArrayType(16);
if(a)
{
b[0]=a[0];
b[1]=a[1];
b[2]=a[2];
b[3]=a[3];
b[4]=a[4];
b[5]=a[5];
b[6]=a[6];
b[7]=a[7];
b[8]=a[8];
b[9]=a[9];
b[10]=a[10];
b[11]=a[11];
b[12]=a[12];
b[13]=a[13];
b[14]=a[14];
b[15]=a[15]
}
return b
};*/
var pMatrix = mat4.create();//投影矩阵
function initGL(canvas) {
try {
canvas.width=screen.width;
canvas.height=screen.height;
gl = canvas.getContext("experimental-webgl");
gl.viewportWidth = canvas.width;
gl.viewportHeight = canvas.height;
} catch (e) {
}
if (!gl) {
alert("Could not initialise WebGL, sorry :-(");
}
}
/**
*这是一个比看起来要简单的函数。我们要做的是在HTML网页中寻找一个元素,其具有与传入参数匹配的ID,取出其内容并基于其类型创建一个片段渲染器或者一个顶点渲染器(以后我们将更多地解释它们的区别),接着将其传入到WebGL中编译成可以在图形卡上运行的形式。接下来,代码进行出错处理,最后完成整个处理。当然,我们只能在JavaScript中将渲染器定义为字符串而不能从HTML中提取——通过这样做,我们使其更易读,因为它们被定义为网页中的脚本,就像它们本身就是JavaScript一样.
事实上,他动态的创建了渲染器语言编写的代码,推送给图形显卡执行,它们使
用一种特殊的与C语言有很大关系的渲染器语言所写。
*/
function getShader(gl, id) {
var shaderScript = document.getElementById(id);
if (!shaderScript) {
return null;
}
var str = "";
var k = shaderScript.firstChild;
while (k) {
if (k.nodeType == 3) {
str += k.textContent;
}
k = k.nextSibling;
}
alert(str);
var shader;
if (shaderScript.type == "x-shader/x-fragment") {
shader = gl.createShader(gl.FRAGMENT_SHADER);
} else if (shaderScript.type == "x-shader/x-vertex") {
shader = gl.createShader(gl.VERTEX_SHADER);
} else {
return null;
}
gl.shaderSource(shader, str);
gl.compileShader(shader);
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
alert(gl.getShaderInfoLog(shader));
return null;
}
return shader;
}
function initShaders() {
var fragmentShader = getShader(gl, "shader-fs");//获取片段渲染器
var vertexShader = getShader(gl, "shader-vs");//获取顶点渲染器
shaderProgram = gl.createProgram();//创建渲染器对象
gl.attachShader(shaderProgram, vertexShader);//绑定顶点渲染器
gl.attachShader(shaderProgram, fragmentShader);//绑定片段渲染器
gl.linkProgram(shaderProgram);//和webGL关联shaderProgram
if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
alert("Could not initialise shaders");
}
gl.useProgram(shaderProgram);//告诉webGLass使用shaderProgram
shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition");//获取属性vertexPositionAttribute
gl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute);//使能
shaderProgram.pMatrixUniform = gl.getUniformLocation(shaderProgram, "uPMatrix");//获取属性pMatrixUniform
shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix");//获取属性pMatrixUniform
}
function setMatrixUniforms() {
gl.uniformMatrix4fv(shaderProgram.pMatrixUniform, false, pMatrix);//将渲染器和投影矩阵绑定
gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mvMatrix);//将渲染器和模型矩阵绑定
}
/**
*初始化图形缓存区 缓冲区实际上是图形卡上的内存
*/
function initBuffers() {
triangleVertexPositionBuffer = gl.createBuffer();//创建三角形顶点数组
gl.bindBuffer(gl.ARRAY_BUFFER, triangleVertexPositionBuffer);//绑定数值
var vertices = [
0.0, 1.0, 0.0,
-1.0, -1.0, 0.0,
1.0, -1.0, 0.0
];//定义三角形
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);//vertices填充缓存区
triangleVertexPositionBuffer.itemSize = 3;//缓存区的列
triangleVertexPositionBuffer.numItems = 3;//缓存区的行 三个独立的顶点位置(numItems),其中每一个由三个数(itemSize)组成
squareVertexPositionBuffer = gl.createBuffer();//正方形
gl.bindBuffer(gl.ARRAY_BUFFER, squareVertexPositionBuffer);
vertices = [
1.0, 1.0, 0.0,
-1.0, 1.0, 0.0,
1.0, -1.0, 0.0,
-1.0, -1.0, 0.0
];
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
squareVertexPositionBuffer.itemSize = 3;
squareVertexPositionBuffer.numItems = 4;
}
//将两个对象的顶点位置放置到图形卡上————————绘制图形
function drawScene() {
gl.viewport(0, 0, gl.viewportWidth, gl.viewportHeight);//告诉 WebGL画布的大小
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);//清除画布
//mat4.perspective=function(a,b,c,d,e){a=c*Math.tan(a*Math.PI/360);b=a*b;return mat4.frustum(-b,b,-a,a,c,d,e)};
mat4.perspective(45, gl.viewportWidth / gl.viewportHeight, 0.1, 100.0, pMatrix);//为场景设置透视参数
//mat3.identity=function(a){a[0]=1;a[1]=0;a[2]=0;a[3]=0;a[4]=1;a[5]=0;a[6]=0;a[7]=0;a[8]=1;return a};
mat4.identity(mvMatrix);//
mat4.translate(mvMatrix, [-1.5, 0.0, -7.0]);//变换
gl.bindBuffer(gl.ARRAY_BUFFER, triangleVertexPositionBuffer);
gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, triangleVertexPositionBuffer.itemSize, gl.FLOAT, false, 0, 0);
setMatrixUniforms();//把矩阵参数传到图形卡,这个函数将模型视图矩阵和投影矩阵从JavaScript中转移到WebGL中,并与渲染器相关
gl.drawArrays(gl.TRIANGLES, 0, triangleVertexPositionBuffer.numItems);//从顶点数组的第0项开始一直到第numItems个元素,将顶点数组绘制成三角形
//alert("triangle Finish!");
mat4.translate(mvMatrix, [3.0, 0.0, 0.0]);
gl.bindBuffer(gl.ARRAY_BUFFER, squareVertexPositionBuffer);
gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, squareVertexPositionBuffer.itemSize, gl.FLOAT, false, 0, 0);
setMatrixUniforms();
gl.drawArrays(gl.TRIANGLE_STRIP, 0, squareVertexPositionBuffer.numItems);
}
function webGLStart() {
var canvas = document.getElementById("lesson01-canvas");
initGL(canvas);
initShaders();
initBuffers();
gl.clearColor(0.0, 0.0, 0.0, 1.0);
gl.enable(gl.DEPTH_TEST);
drawScene();
}
</script>
希望您有所收获,也希望我有所进步!
夜深了,当所有离你远去的时候,你选择了编程,无所谓成功或者成就,只为真实的向梦想靠近,孤独并快乐着!晚上下班时,看见地铁站两个年轻人,忘情地抱着吉他,唱着歌,他们贫穷却快乐着!有时候人生或许就是这样,坚强地活着,并快乐!我没有能力给他们钱,但我却有跟唱歌者同样的心情,或是爱,或是情,那些远去的,那些我们真正在乎的东西!
渲染器是这样一些代码,在一个场景开始绘制之前,它能对场景的任何部分做任何处理。这的确十分有用,由于它运行在图形卡上,所以它能很快运行且能很便利地做各种变换。
渲染器运行在图形卡上获得WebGL系统,它把模型视图矩阵和投影矩阵应用到场景中,而不需要使用相对较慢的JavaScript来移动场景中的每一个点和每一个三角形顶点。这相当有用并且值得额外的开销。
下面我们来看一个简单的例子:
function initShaders() {
var fragmentShader = getShader(gl, "shader-fs");//获取片段渲染器
var vertexShader = getShader(gl, "shader-vs");//获取顶点渲染器
shaderProgram = gl.createProgram();//创建渲染器对象
gl.attachShader(shaderProgram, vertexShader);//绑定顶点渲染器
gl.attachShader(shaderProgram, fragmentShader);//绑定片段渲染器
gl.linkProgram(shaderProgram);//和webGL关联shaderProgram
if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
alert("Could not initialise shaders");
}
gl.useProgram(shaderProgram);//告诉webGLass使用shaderProgram
shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition");//获取属性vertexPositionAttribute
gl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute);//使能
shaderProgram.pMatrixUniform = gl.getUniformLocation(shaderProgram, "uPMatrix");//获取属性pMatrixUniform
shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix");//获取属性pMatrixUniform
}
至此,初始化渲染器完成。其中有个自定义函数,需要特别解释:
/**
*这是一个比看起来要简单的函数。我们要做的是在HTML网页中寻找一个元素,其具有与传入参数匹配的ID,取出其内容并基于其类型创建一个片段渲染器或者一个顶点渲染器(以后我们将更多地解释它们的区别),接着将其传入到WebGL中编译成可以在图形卡上运行的形式。接下来,代码进行出错处理,最后完成整个处理。当然,我们只能在JavaScript中将渲染器定义为字符串而不能从HTML中提取——通过这样做,我们使其更易读,因为它们被定义为网页中的脚本,就像它们本身就是JavaScript一样.
事实上,他动态的创建了渲染器语言编写的代码,推送给图形显卡执行,它们使
用一种特殊的与C语言有很大关系的渲染器语言所写。
*/
function getShader(gl, id) {
var shaderScript = document.getElementById(id);
if (!shaderScript) {
return null;
}
var str = "";
var k = shaderScript.firstChild;
while (k) {
if (k.nodeType == 3) {
str += k.textContent;
}
k = k.nextSibling;
}
alert(str);
var shader;
if (shaderScript.type == "x-shader/x-fragment") {
shader = gl.createShader(gl.FRAGMENT_SHADER);
} else if (shaderScript.type == "x-shader/x-vertex") {
shader = gl.createShader(gl.VERTEX_SHADER);
} else {
return null;
}
gl.shaderSource(shader, str);
gl.compileShader(shader);
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
alert(gl.getShaderInfoLog(shader));
return null;
}
return shader;
}
至此,创建渲染器对象完成,(实际上他实在拼接渲染器代码之后,和webGL绑定的)。
最后,贴上完整的JS代码,如果不出意外(当然HTML自己写)页面上就能看见三角形和正方形了(合适的浏览器):
<script type="text/javascript" src="glMatrix-0.9.5.min.js"></script>
<script id="shader-fs" type="x-shader/x-fragment">
precision mediump float;
void main(void) {
gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}
</script>
<script id="shader-vs" type="x-shader/x-vertex">
attribute vec3 aVertexPosition;
uniform mat4 uMVMatrix;
uniform mat4 uPMatrix;
void main(void) {
gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);
}
</script>
<script type="text/javascript" charset="UTF-8">
var gl;
var triangleVertexPositionBuffer;
var squareVertexPositionBuffer;
var shaderProgram;//渲染器对象
var mvMatrix = mat4.create();//模型矩阵
/**
mat4.create=function(a){
var b=new glMatrixArrayType(16);
if(a)
{
b[0]=a[0];
b[1]=a[1];
b[2]=a[2];
b[3]=a[3];
b[4]=a[4];
b[5]=a[5];
b[6]=a[6];
b[7]=a[7];
b[8]=a[8];
b[9]=a[9];
b[10]=a[10];
b[11]=a[11];
b[12]=a[12];
b[13]=a[13];
b[14]=a[14];
b[15]=a[15]
}
return b
};*/
var pMatrix = mat4.create();//投影矩阵
function initGL(canvas) {
try {
canvas.width=screen.width;
canvas.height=screen.height;
gl = canvas.getContext("experimental-webgl");
gl.viewportWidth = canvas.width;
gl.viewportHeight = canvas.height;
} catch (e) {
}
if (!gl) {
alert("Could not initialise WebGL, sorry :-(");
}
}
/**
*这是一个比看起来要简单的函数。我们要做的是在HTML网页中寻找一个元素,其具有与传入参数匹配的ID,取出其内容并基于其类型创建一个片段渲染器或者一个顶点渲染器(以后我们将更多地解释它们的区别),接着将其传入到WebGL中编译成可以在图形卡上运行的形式。接下来,代码进行出错处理,最后完成整个处理。当然,我们只能在JavaScript中将渲染器定义为字符串而不能从HTML中提取——通过这样做,我们使其更易读,因为它们被定义为网页中的脚本,就像它们本身就是JavaScript一样.
事实上,他动态的创建了渲染器语言编写的代码,推送给图形显卡执行,它们使
用一种特殊的与C语言有很大关系的渲染器语言所写。
*/
function getShader(gl, id) {
var shaderScript = document.getElementById(id);
if (!shaderScript) {
return null;
}
var str = "";
var k = shaderScript.firstChild;
while (k) {
if (k.nodeType == 3) {
str += k.textContent;
}
k = k.nextSibling;
}
alert(str);
var shader;
if (shaderScript.type == "x-shader/x-fragment") {
shader = gl.createShader(gl.FRAGMENT_SHADER);
} else if (shaderScript.type == "x-shader/x-vertex") {
shader = gl.createShader(gl.VERTEX_SHADER);
} else {
return null;
}
gl.shaderSource(shader, str);
gl.compileShader(shader);
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
alert(gl.getShaderInfoLog(shader));
return null;
}
return shader;
}
function initShaders() {
var fragmentShader = getShader(gl, "shader-fs");//获取片段渲染器
var vertexShader = getShader(gl, "shader-vs");//获取顶点渲染器
shaderProgram = gl.createProgram();//创建渲染器对象
gl.attachShader(shaderProgram, vertexShader);//绑定顶点渲染器
gl.attachShader(shaderProgram, fragmentShader);//绑定片段渲染器
gl.linkProgram(shaderProgram);//和webGL关联shaderProgram
if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
alert("Could not initialise shaders");
}
gl.useProgram(shaderProgram);//告诉webGLass使用shaderProgram
shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, "aVertexPosition");//获取属性vertexPositionAttribute
gl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute);//使能
shaderProgram.pMatrixUniform = gl.getUniformLocation(shaderProgram, "uPMatrix");//获取属性pMatrixUniform
shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, "uMVMatrix");//获取属性pMatrixUniform
}
function setMatrixUniforms() {
gl.uniformMatrix4fv(shaderProgram.pMatrixUniform, false, pMatrix);//将渲染器和投影矩阵绑定
gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mvMatrix);//将渲染器和模型矩阵绑定
}
/**
*初始化图形缓存区 缓冲区实际上是图形卡上的内存
*/
function initBuffers() {
triangleVertexPositionBuffer = gl.createBuffer();//创建三角形顶点数组
gl.bindBuffer(gl.ARRAY_BUFFER, triangleVertexPositionBuffer);//绑定数值
var vertices = [
0.0, 1.0, 0.0,
-1.0, -1.0, 0.0,
1.0, -1.0, 0.0
];//定义三角形
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);//vertices填充缓存区
triangleVertexPositionBuffer.itemSize = 3;//缓存区的列
triangleVertexPositionBuffer.numItems = 3;//缓存区的行 三个独立的顶点位置(numItems),其中每一个由三个数(itemSize)组成
squareVertexPositionBuffer = gl.createBuffer();//正方形
gl.bindBuffer(gl.ARRAY_BUFFER, squareVertexPositionBuffer);
vertices = [
1.0, 1.0, 0.0,
-1.0, 1.0, 0.0,
1.0, -1.0, 0.0,
-1.0, -1.0, 0.0
];
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
squareVertexPositionBuffer.itemSize = 3;
squareVertexPositionBuffer.numItems = 4;
}
//将两个对象的顶点位置放置到图形卡上————————绘制图形
function drawScene() {
gl.viewport(0, 0, gl.viewportWidth, gl.viewportHeight);//告诉 WebGL画布的大小
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);//清除画布
//mat4.perspective=function(a,b,c,d,e){a=c*Math.tan(a*Math.PI/360);b=a*b;return mat4.frustum(-b,b,-a,a,c,d,e)};
mat4.perspective(45, gl.viewportWidth / gl.viewportHeight, 0.1, 100.0, pMatrix);//为场景设置透视参数
//mat3.identity=function(a){a[0]=1;a[1]=0;a[2]=0;a[3]=0;a[4]=1;a[5]=0;a[6]=0;a[7]=0;a[8]=1;return a};
mat4.identity(mvMatrix);//
mat4.translate(mvMatrix, [-1.5, 0.0, -7.0]);//变换
gl.bindBuffer(gl.ARRAY_BUFFER, triangleVertexPositionBuffer);
gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, triangleVertexPositionBuffer.itemSize, gl.FLOAT, false, 0, 0);
setMatrixUniforms();//把矩阵参数传到图形卡,这个函数将模型视图矩阵和投影矩阵从JavaScript中转移到WebGL中,并与渲染器相关
gl.drawArrays(gl.TRIANGLES, 0, triangleVertexPositionBuffer.numItems);//从顶点数组的第0项开始一直到第numItems个元素,将顶点数组绘制成三角形
//alert("triangle Finish!");
mat4.translate(mvMatrix, [3.0, 0.0, 0.0]);
gl.bindBuffer(gl.ARRAY_BUFFER, squareVertexPositionBuffer);
gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, squareVertexPositionBuffer.itemSize, gl.FLOAT, false, 0, 0);
setMatrixUniforms();
gl.drawArrays(gl.TRIANGLE_STRIP, 0, squareVertexPositionBuffer.numItems);
}
function webGLStart() {
var canvas = document.getElementById("lesson01-canvas");
initGL(canvas);
initShaders();
initBuffers();
gl.clearColor(0.0, 0.0, 0.0, 1.0);
gl.enable(gl.DEPTH_TEST);
drawScene();
}
</script>
希望您有所收获,也希望我有所进步!
夜深了,当所有离你远去的时候,你选择了编程,无所谓成功或者成就,只为真实的向梦想靠近,孤独并快乐着!晚上下班时,看见地铁站两个年轻人,忘情地抱着吉他,唱着歌,他们贫穷却快乐着!有时候人生或许就是这样,坚强地活着,并快乐!我没有能力给他们钱,但我却有跟唱歌者同样的心情,或是爱,或是情,那些远去的,那些我们真正在乎的东西!
相关推荐
【标题】"WebGL喷泉粒子发射动画特效"是一个利用WebGL技术实现的创新视觉效果,它基于HTML5的Canvas 2D接口,为用户提供了一种全屏的彩虹粒子喷泉展示。这种特效通常用于网站设计,提升用户体验,或者作为交互式艺术...
本书名为《交互式计算机图形学——基于WebGL的自顶向下技术 英文第七版》,是电子工业出版社出版的教材,由Edward Angel与Dave Shreiner共同撰写,张荣华、宋雨等人翻译。该书的标签为“计算机图形学”和“WebGL”,...
标题提到的问题——"解决webgl输入框无法输入中文插件",是WebGL应用中常见的一个挑战。通常,当用户尝试在WebGL场景中使用HTML输入框输入中文时,可能会遇到输入困难或无法输入的情况。这主要是因为WebGL与HTML元素...
2. **坐标系统与视口**:讲解WebGL中的坐标系,包括视口坐标、归一化设备坐标和剪裁空间坐标,以及如何在这些坐标系统之间转换。 3. **颜色与光照**:介绍颜色理论,包括RGB、RGBA模型,以及WebGL中的颜色混合和...
在“HiWebGL-《拥抱 3D 网络世界 —— WebGL 的现状和未来》”中,可能包含以下内容: 1. **上下文创建**:在JavaScript中,我们使用`canvas.getContext('webgl')`来获取WebGL渲染上下文,这是开始所有WebGL操作的...
3. **着色器**:WebGL使用两种类型的着色器——顶点着色器和片段着色器。顶点着色器处理顶点数据,片段着色器决定像素颜色。 4. **缓冲区**:WebGL使用缓冲区存储顶点数据,如位置、颜色和纹理坐标。`gl.bindBuffer...
在WebGL编程中,着色器是至关重要的组成部分,它们负责处理图形渲染的计算工作。在WebGL的上下文中,着色器分为两种主要类型:顶点着色器(Vertex Shader)和片段着色器(Fragment Shader)。这些着色器程序可以使用...
本文将详细介绍一种新的解决方案——WebGL着色器,它能够帮助开发者实现几乎任何类型的视频滤镜效果。 #### 二、问题概述及传统方法局限性 ##### 2.1 CSS3滤镜的局限性 在讨论WebGL着色器之前,我们首先回顾一下...
4. **着色器**:WebGL使用两种类型的着色器——顶点着色器和片段着色器。顶点着色器处理顶点数据,片段着色器负责像素颜色的计算。 5. **纹理映射**:在3D模型上应用纹理,增加真实感。理解如何加载、绑定和应用...
2. **better-unity-webgl-template**: 这个模板可能是一个第三方改进版,旨在提供比默认模板更好的性能和功能。通常,这类模板会包含一些优化策略,比如代码压缩、资源预加载、错误处理和调试工具等,以改善用户在...
##### WebGL——技术定义 WebGL是一种用于在Web浏览器中绘制3D图形的标准API(应用程序编程接口)。它基于OpenGL ES 2.0标准的一个子集,并且被设计成可以直接在HTML5的canvas元素上运行,无需任何插件或额外的软件...
2. **WebGL上下文**:在HTML5 canvas元素上创建WebGL上下文是开始编程的第一步。理解如何获取和配置上下文,以及设置视口、清除颜色和深度缓冲等基本操作。 3. **顶点着色器和片段着色器**:WebGL使用两种主要的...
3. **着色器**:WebGL使用两种类型的着色器——顶点着色器和片段着色器。顶点着色器处理每个顶点,而片段着色器处理每个像素。这些着色器用GLSL(OpenGL Shading Language)编写,通过`gl.createShader()`和`gl....
在这个场景中,我们提到的几个JavaScript文件——cuon-matrix.js, cuon-utils.js, webgl-debug.js, 和 webgl-utils.js,都是WebGL编程中常用的公用函数库,它们为开发者提供了便利的功能,简化了WebGL编程的复杂性。...
- 本书最后章节提供了一个完整的实战项目——开发一个基于WebGL的赛车游戏应用。 - 该项目涵盖了从设计到实现的全过程,包括3D模型的选择、场景布局的设计、物理引擎的集成以及用户界面的开发等方面。 - 通过实际...
交互式计算机图形学 基于WEBGL的自顶向下方法 原书第7版
4. **着色器(Shader)**:WebGL使用两种类型的着色器——顶点着色器和片段着色器。顶点着色器处理每个顶点,而片段着色器处理像素颜色。它们是用GLSL(OpenGL Shading Language)编写的,并通过`gl.createShader()`和...
本篇将详细介绍四个与WebGL相关的函数库——cuon-matrix、cuon-utils、webgl-debug以及webgl-utils,它们是WebGL开发中的常用工具,极大地简化了WebGL编程。 1. cuon-matrix: cuon-matrix是一个专门处理矩阵运算...
3. **着色器**:WebGL使用两种类型的着色器——顶点着色器和片段着色器。顶点着色器处理顶点数据,而片段着色器决定像素的颜色。着色器语言GLSL用于编写这些程序。 4. **GPU编程**:WebGL的本质是GPU编程,这意味着...
在本项目"html5_3d_webgl_多个旋转地球materials"中,我们关注的是HTML5的一个强大特性——WebGL,这是一种用于在浏览器中实现3D图形的API。WebGL基于OpenGL标准,允许开发者在无需任何插件的情况下在网页上呈现复杂...