webGL=>着色器的变量声明、设置、预定变量等

devtools/2024/10/18 3:25:57/

目录

简介

变量特点

1. Attribute 变量

2. Uniform 变量

3. Varying 变量

4. Const 变量

5. 预定义变量

示例:

1. 顶点着色器示例

2. 片元着色器示例:

设置attribute示例

设置uniform示例

完整代码示例:


简介

着色器中变量声明: attribute、varing、uniform。设置attribute、uniform。预定义变量。const变量。

变量特点

1. Attribute 变量

用于接收顶点数据,只能在顶点着色器中声明和使用。

attribute vec3 a_position;

2. Uniform 变量

用于在 JavaScript 代码中设置并在着色器程序中保持不变的值,可以在顶点着色器和片元着色器中声明和使用。但是必现要保证变量名唯一,即顶点着色器和片元着色器的uniform变量不能相同。

uniform mat4 u_modelMatrix;

3. Varying 变量

用于在顶点着色器和片元着色器之间传递数据,顶点着色器中声明的 varying 变量的值会被插值后传递给片元着色器。

varying vec4 v_color;

4. Const 变量

在着色器中声明的常量值,在整个着色器程序中保持不变。

const float PI = 3.14159265359;

5. 预定义变量

WebGL 中内置了一些预定义的特殊变量,如 gl_Position(顶点着色器中)和 gl_FragColor(片元着色器中),它们分别用于设置顶点位置和片元颜色。

示例:

1. 顶点着色器示例

// 编译顶点着色器
var vertexShaderSource = `attribute vec3 a_position;attribute vec4 a_color;attribute vec2 a_texcoord;uniform mat4 u_modelMatrix;uniform mat4 u_viewMatrix;uniform mat4 u_projectionMatrix;varying vec4 v_color;varying vec2 v_texcoord;void main() {gl_Position = u_projectionMatrix * u_viewMatrix * u_modelMatrix * vec4(a_position, 1.0);v_color = a_color;v_texcoord = a_texcoord;}
`;

2. 片元着色器示例:

// 编译片元着色器
var fragmentShaderSource = `precision mediump float;varying vec4 v_color;varying vec2 v_texcoord;void main() {gl_FragColor = v_color;}
`;

设置attribute示例

// 设置顶点属性
var positionAttributeLocation = gl.getAttribLocation(program, "a_position");
var colorAttributeLocation = gl.getAttribLocation(program, "a_color");
var texcoordAttributeLocation = gl.getAttribLocation(program, "a_texcoord");
gl.enableVertexAttribArray(positionAttributeLocation);
gl.enableVertexAttribArray(colorAttributeLocation);
gl.enableVertexAttribArray(texcoordAttributeLocation);

设置uniform示例

// 计算模型、视图和投影矩阵
var modelMatrix = mat4.create(); // 模型矩阵
var viewMatrix = mat4.create(); // 视图矩阵
var projectionMatrix = mat4.create(); // 投影矩阵// 设置模型矩阵
mat4.translate(modelMatrix, modelMatrix, [0.0, 0.0, -5.0]);// 设置视图矩阵
mat4.lookAt(viewMatrix, [0, 0, 5], [0, 0, 0], [0, 1, 0]);// 设置投影矩阵
mat4.perspective(projectionMatrix, Math.PI / 4, canvas.width / canvas.height, 0.1, 100);// 将模型、视图和投影矩阵传递给顶点着色器
var modelMatrixUniformLocation = gl.getUniformLocation(program, "u_modelMatrix");
gl.uniformMatrix4fv(modelMatrixUniformLocation, false, modelMatrix);var viewMatrixUniformLocation = gl.getUniformLocation(program, "u_viewMatrix");
gl.uniformMatrix4fv(viewMatrixUniformLocation, false, viewMatrix);var projectionMatrixUniformLocation = gl.getUniformLocation(program, "u_projectionMatrix");
gl.uniformMatrix4fv(projectionMatrixUniformLocation, false, projectionMatrix);

完整代码示例:

// 获取 WebGL 上下文
var canvas = document.getElementById("webgl-canvas");
var gl = canvas.getContext("webgl");// 编译顶点着色器
var vertexShaderSource = `attribute vec3 a_position;attribute vec4 a_color;attribute vec2 a_texcoord;uniform mat4 u_modelMatrix;uniform mat4 u_viewMatrix;uniform mat4 u_projectionMatrix;varying vec4 v_color;varying vec2 v_texcoord;void main() {gl_Position = u_projectionMatrix * u_viewMatrix * u_modelMatrix * vec4(a_position, 1.0);v_color = a_color;v_texcoord = a_texcoord;}
`;
var vertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertexShader, vertexShaderSource);
gl.compileShader(vertexShader);// 编译片元着色器
var fragmentShaderSource = `precision mediump float;varying vec4 v_color;varying vec2 v_texcoord;void main() {gl_FragColor = v_color;}
`;
var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragmentShader, fragmentShaderSource);
gl.compileShader(fragmentShader);// 创建着色器程序并链接
var program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
gl.useProgram(program);// 设置顶点属性
var positionAttributeLocation = gl.getAttribLocation(program, "a_position");
var colorAttributeLocation = gl.getAttribLocation(program, "a_color");
var texcoordAttributeLocation = gl.getAttribLocation(program, "a_texcoord");
gl.enableVertexAttribArray(positionAttributeLocation);
gl.enableVertexAttribArray(colorAttributeLocation);
gl.enableVertexAttribArray(texcoordAttributeLocation);// 计算模型、视图和投影矩阵
var modelMatrix = mat4.create(); // 模型矩阵
var viewMatrix = mat4.create(); // 视图矩阵
var projectionMatrix = mat4.create(); // 投影矩阵// 设置模型矩阵
mat4.translate(modelMatrix, modelMatrix, [0.0, 0.0, -5.0]);// 设置视图矩阵
mat4.lookAt(viewMatrix, [0, 0, 5], [0, 0, 0], [0, 1, 0]);// 设置投影矩阵
mat4.perspective(projectionMatrix, Math.PI / 4, canvas.width / canvas.height, 0.1, 100);// 将模型、视图和投影矩阵传递给顶点着色器
var modelMatrixUniformLocation = gl.getUniformLocation(program, "u_modelMatrix");
gl.uniformMatrix4fv(modelMatrixUniformLocation, false, modelMatrix);var viewMatrixUniformLocation = gl.getUniformLocation(program, "u_viewMatrix");
gl.uniformMatrix4fv(viewMatrixUniformLocation, false, viewMatrix);var projectionMatrixUniformLocation = gl.getUniformLocation(program, "u_projectionMatrix");
gl.uniformMatrix4fv(projectionMatrixUniformLocation, false, projectionMatrix);// 顶点数据
var vertices = [-0.5, -0.5, 0.0,  // 顶点位置1.0, 0.0, 0.0, 1.0, // 顶点颜色,红色0.0, 0.0,          // 顶点纹理坐标0.5, -0.5, 0.0,  0.0, 1.0, 0.0, 1.0, // 顶点颜色,绿色1.0, 0.0,          0.0,  0.5, 0.0,0.0, 0.0, 1.0, 1.0, // 顶点颜色,蓝色0.5, 1.0           
];
var vertexBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);// 将顶点位置属性绑定到缓冲区
gl.vertexAttribPointer(positionAttributeLocation, 3, gl.FLOAT, false, 8 * Float32Array.BYTES_PER_ELEMENT, 0);
gl.vertexAttribPointer(colorAttributeLocation, 4, gl.FLOAT, false, 8 * Float32Array.BYTES_PER_ELEMENT, 3 * Float32Array.BYTES_PER_ELEMENT);
gl.vertexAttribPointer(texcoordAttributeLocation, 2, gl.FLOAT, false, 8 * Float32Array.BYTES_PER_ELEMENT, 7 * Float32Array.BYTES_PER_ELEMENT)


http://www.ppmy.cn/devtools/34480.html

相关文章

斐波那契数

509. 斐波那契数 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) 0,F(1) 1 F(n) F(n - 1) F(n - 2),其中 …

常见的容器技术有哪些

容器技术是一种轻量级的软件封装方式,它将软件代码及其依赖项打包在一起,这样应用可以在任何支持容器的系统上无缝运行。它允许应用程序及其依赖项在一个隔离的环境中运行,这个环境被称为容器。容器技术有助于提高应用程序的可移植性、一致性…

MySql的基本操作

一、连接数据库,查看对象,数据库的维护,mysql的数据类型 1、连接数据库 mysql -hlocalhost -uroot -proot 2、查看对象 show databases; 查看有哪些数据库 show tables;查看有哪些表 show columns from [table_name];查看表里有哪些字段…

通过七析BI自定义组件实现3D效果图表渲染

关于可视化的一些概念已经在之前的文章进行了大概的介绍,接下来我们会更加深入探讨关于呈现效果的内容。 为什么要用3D图表在仪表盘中进行呈现? 当讨论到这个问题的时候,自然就会回归到一个核心:3D与2D的呈现效果有什么区别&#…

CMakeLists.txt语法规则:提供信息的变量说明一

一. 简介 前面几篇文章学习了 CMakeLists.txt语法中 部分常用命令。 接下来学习CMakeLists.txt语法中部分常用变量,变量也是 cmake 中的一个重头戏,cmake 提供了很多内置变量。每一个变量都有它自己的含义,可以通过如下链接地址查询到所有…

Github 2024-05-06 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-05-06统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Jupyter Notebook项目2Python项目2C#项目1JavaScript项目1Cuda项目1TypeScript项目1Rust项目1C项目1简单、纯净的C/CUDA中的LLM培训 创建周期:…

GO语言核心30讲 实战与应用 (第一部分)

原站地址:Go语言核心36讲_Golang_Go语言-极客时间 一、测试的基本规则和流程 1. GO程序主要分三类测试:功能测试、性能测试,以及示例测试。 示例测试和功能测试差不多,但它更关注程序打印出来的内容。 2. 测试文件的名称应该以…

Phi-2:小型语言模型令人惊人的能力

导语 phi-系列模型是微软研究团队推出的轻量级人工智能模型,旨在实现“小而精”的目标,能够实现在低功耗设备上例如智能手机和平板电脑上部署运行。截止目前,已经发布到了phi-3模型,本系列博客将沿着最初的phi-1到phi-1.5&#x…