成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一起學 WebGL:改變點的顏色

開發 前端
這是設置片元著色器的 Float 精度為高精度。因為現在桌面端瀏覽器性能都很好,我們直接設置高精度即可。此外還有 Mediump 中等精度,和 Lowp 低精度,適合用在一些性能羸弱的設備上。精度越低,渲染的效果越差。

大家好,我是前端西瓜哥,上一章我們用 attribute 變量,從外部設置頂點著色器中點的位置信息。

《??一起學 WebGL:動態繪制點??》

這次我們把目光投向片元著色器,通過片元著色器修改點的顏色。

片元著色器

片元著色器的代碼改一下:

const fragmentShaderSrc = `
precision mediump float;
uniform vec4 u_FragColor;
void main() {
gl_FragColor = u_FragColor;
}
`;

類似頂點著色器的 attribute,我們在這里聲明了一個 uniform 變量 u_FragColor,同樣我們使用過的是 vec4 類型,4 個浮點數組成的結構體。

片元著色器中不能設置 attribute 類型的變量,只能用 uniform,或者也能用 varing 變量,支持從頂點著色器傳遞數據到片元著色器,這個以后西瓜哥會專門講解。

我們會將這個變量賦值給 WebGL 片元著色器的內置屬性 gl_FragColor,確定圖形的顏色。

此外,因為使用了變量,所以頂部要加一個 precision highp float; 的玩意。

這是設置片元著色器的 float 精度為高精度。因為現在桌面端瀏覽器性能都很好,我們直接設置高精度即可。此外還有 mediump 中等精度,和 lowp 低精度,適合用在一些性能羸弱的設備上。精度越低,渲染的效果越差。

然后就是給我們聲明的 u_FragColor 傳值了,在 JavaScript 里。

修改顏色

/** 修改片元著色器的 uniform **/
const u_FragColor = gl.getUniformLocation(gl.program, "u_FragColor");
gl.uniform4f(u_FragColor, 1, 1, 0, 1); // 綠色

西瓜哥這里通過 gl.getUniformLocation 方法獲取對應程序對象中片元著色器的名為 u_FragColor 的 uniform 變量的地址。

然后通過 gl.uniform4f 給這個 uniform 類型賦值。

WebGL 中的顏色分量取值范圍是 0 到 1,對應的是一個 比值,比如 vec4(1.0, 0.5, 0, 0.5),其實就等價于 rbga(255, 255*0.5, 0, 0.5) 。

渲染結果:

圖片

代碼實現:

/**
* wegbl 繪制一個點
*/

/** @type {HTMLCanvasElement} */
const canvas = document.querySelector("canvas");
const gl = canvas.getContext("webgl");

const vertexShaderSrc = `
attribute vec4 a_Position;
void main() {
gl_Position = a_Position;
gl_PointSize = 30.0;
}
`;

const fragmentShaderSrc = `
precision highp float;
uniform vec4 u_FragColor;
void main() {
gl_FragColor = u_FragColor;
}
`;

/**** 渲染器生成處理 ****/
// 創建頂點渲染器
const vertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertexShader, vertexShaderSrc);
gl.compileShader(vertexShader);
// 創建片元渲染器
const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragmentShader, fragmentShaderSrc);
gl.compileShader(fragmentShader);
// 程序對象
const program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
gl.useProgram(program);
gl.program = program;

/** 修改頂點著色器的 attribute */
const a_Position = gl.getAttribLocation(gl.program, "a_Position");
gl.vertexAttrib3f(a_Position, 0, 0, 0);

/** 【本章新增的代碼】修改片元著色器的 uniform **/
const u_FragColor = gl.getUniformLocation(gl.program, "u_FragColor");
gl.uniform4f(u_FragColor, 0, 1, 0, 1);

/** 畫布繪制 **/
// 清空畫布,并指定顏色
gl.clearColor(0, 0, 0, 1);
gl.clear(gl.COLOR_BUFFER_BIT);
// 繪制點
gl.drawArrays(gl.POINTS, 0, 1);

Demo 地址:

https://codesandbox.io/s/xp81lh?file=/index.js。

這個 demo 加了點料,寫了個定時器不斷修改顏色的函數,將底部的 // changeColor(); 的注釋取消掉即可看到顏色變化的效果。

結尾

下一節我們就真正來繪制三角形了。復雜的三維物體,都可以通過一個個很小的三角形組成,三角形越多,三維物體就越精細。

責任編輯:姜華 來源: 前端西瓜哥
相關推薦

2023-04-12 07:46:24

JavaScriptWebGL

2023-04-11 07:48:32

WebGLCanvas

2023-04-26 07:42:16

WebGL圖元的類型

2023-03-29 07:31:09

WebGL坐標系

2023-05-04 08:48:42

WebGL復合矩陣

2023-06-26 15:14:19

WebGL紋理對象學習

2023-05-31 20:10:03

WebGL繪制立方體

2023-05-16 07:44:03

紋理映射WebGL

2023-05-17 08:28:55

2023-04-27 08:27:29

WebGL變形矩陣

2023-04-17 09:01:01

WebGL繪制三角形

2023-05-08 07:29:48

WebGL視圖矩陣

2022-12-02 14:20:09

Tetris鴻蒙

2022-11-29 16:35:02

Tetris鴻蒙

2023-03-30 09:32:27

2022-11-14 17:01:34

游戲開發畫布功能

2023-05-06 07:23:57

2024-02-28 12:12:20

Pipeline數據機制

2023-11-13 22:27:53

Mapping數據庫

2023-02-28 07:28:50

Spritepixijs
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 九九亚洲 | 精品91久久久 | 久久99深爱久久99精品 | 亚洲精品天堂 | 高清欧美性猛交 | 亚洲成人一级 | 久久婷婷国产麻豆91 | 欧美一级在线免费观看 | 日韩av一二三区 | 久久久久久久综合 | 一本岛道一二三不卡区 | 久久精品国产99国产 | 欧美日韩高清在线一区 | 9999久久 | 日韩电影免费观看中文字幕 | 成人免费看片 | 日韩精品一区中文字幕 | 久久精品小视频 | 97国产精品 | 91视频进入 | 久久久xx| 日日干日日操 | 99精品一级欧美片免费播放 | 欧美综合国产精品久久丁香 | 日韩成人在线免费观看 | 欧美日产国产成人免费图片 | 91精品国产91久久久久久密臀 | 狠狠爱综合网 | 日韩无 | 午夜成人免费视频 | 国产成人高清 | 亚洲成人精品影院 | 老妇激情毛片免费 | 亚洲激情综合 | 日日夜夜草 | 亚洲成人精 | 国产精品一区二区三区久久久 | 久热国产精品视频 | 亚洲精品一区二区三区中文字幕 | 视频在线一区二区 | www.xxxx欧美|