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

目录

简介

变量特点

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.mfbz.cn/a/594236.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

流畅的Python阅读笔记

五一快乐的时光总是飞快了,不知多久没有拿起键盘写文章了,最近公司有Python的需求,想着复习下Python吧,然后就买了本Python的书籍 书名: 《流畅的Python》 下面是整理的一个阅读笔记,大家自行查阅&#xf…

Python 全栈系列241 GFGo Lite迭代

说明 随着整个算网开发逐渐深入,各个组件、微服务的数量、深度在不断增加。由于算网是个人项目,我一直按照MVP(Minimum Viable Product )的原则在推进。由于最初的时候对架构、算法和业务的理解并没有那么深刻,所以MVP的内容还是在不断变化&…

选择深度学习框架:TensorFlow 2 vs PyTorch

TensorFlow 2 vs PyTorch 选择深度学习框架:TensorFlow 2 vs PyTorchTensorFlow 2概述TensorFlow 2的优点TensorFlow 2的缺点 PyTorch概述PyTorch的优点PyTorch的缺点 选择建议对于选择困难症的人,我给你们的答案——PyTorch选择理由:结论&am…

数据结构(C):玩转链表

🍺0.前言 言C之言,聊C之识,以C会友,共向远方。各位博友的各位你们好啊,这里是持续分享数据结构知识的小赵同学,今天要分享的数据结构知识是链表,在这一章,小赵将会向大家展开聊聊链表…

常用语音识别开源四大工具:Kaldi,PaddleSpeech,WeNet,EspNet

无论是基于成本效益还是社区支持,我都坚决认为开源才是推动一切应用的动力源泉。下面推荐语音识别开源工具:Kaldi,Paddle,WeNet,EspNet。 1、最成熟的Kaldi 一个广受欢迎的开源语音识别工具,由Daniel Pove…

Servlet框架

简介 Servlet是运行在web服务器或应用服务器上的程序,他是作为来自web浏览器或其他http客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层。 使用Servlet可以手机来自网页表单的用户输入,呈现来自数据库或者其他源记录,还可以动态创…

IDEA访问不到静态资源

背景 我在resources下创建static文件夹,再创建front文件夹放前端资源,里面有index.html,游览器输入localhost:8011/front没反应。(resources/static/front/index.html) 解决办法 重启idea,清楚idea缓存&am…

设计模式之服务定位器模式

想象一下,你的Java应用是一座庞大的迷宫,里面藏着无数宝贵的服务宝藏,而你正需要一张精确的藏宝图来指引方向,迅速找到并利用这些宝藏。服务定位器模式,正是这样一张神奇的地图,它帮你动态定位并获取应用中…

stl容器 string类的基本操作

目录 一.string类的构造 二.string类的输出 1.传统字符串输出 2.通过迭代器进行输出 ​编辑 3.C11标准的范围for输出加auto推导类型 三.string类的各种迭代器 begin()和end() 利用迭代器遍历输出 利用迭代器修改字符串的字符 rbgin()和rend() 利用迭代器遍…

[论文阅读]Adversarial Autoencoders(aae)和代码

In this paper, we propose the “adversarial autoencoder” (AAE), which is a probabilistic autoencoder that uses the recently proposed generative adversarial networks (GAN) to perform variational inference by matching the aggregated posterior of the hidden …

【人工智能基础】RNN实验

一、RNN特性 权重共享 wordi weight bais 持久记忆单元 wordi weightword baisword hi weighth baish 二、公式化表达 ht</sub f(ht - 1, xt) ht tanh(Whhht - 1 Wxhxt) yt Whyht 三、RNN网络正弦波波形预测 环境准备 import numpy as np import torch …

服务器端优化-Redis内存划分和内存配置

6、服务器端优化-Redis内存划分和内存配置 当Redis内存不足时&#xff0c;可能导致Key频繁被删除、响应时间变长、QPS不稳定等问题。当内存使用率达到90%以上时就需要我们警惕&#xff0c;并快速定位到内存占用的原因。 有关碎片问题分析 Redis底层分配并不是这个key有多大&…

PG 全页写

1.什么是全页写 修改一个块的时候&#xff0c;把块读到内存中&#xff0c;commit后,WAL写进程会触发写&#xff0c;把修改的块写到WAL日志文件&#xff0c;如果再往这个块中插入一条数据&#xff0c;数据缓冲区里面的块有两条数据了&#xff0c;再次commit后&#xff0c;PG会把…

图像处理--空域滤波增强(原理)

一、均值滤波 线性滤波算法&#xff0c;采用的主要是邻域平均法。基本思想是使用几个像素灰度的某种平均值来代替一个原来像素的灰度值。可以新建一个MN的窗口以为中心&#xff0c;这个窗口S就是的邻域。假设新的新的像素灰度值为&#xff0c;则计算公式为 1.1 简单平均法 就是…

在excel中,alt+13和alt+10都是什么字符?

1.回车符与换行符 Alt13是回车符&#xff0c;Alt10是换行符。 2.用在microsoft word中 在microsoft office中&#xff0c;回车符 和 换行符 对文本来讲都有换行的作用&#xff0c;但它们并不是同一种符号。下图是在word中两种字符的显示&#xff0c; 当使用 回车符 进行文本…

Ubuntu MATE系统下WPS显示错位

系统&#xff1a;Ubuntu MATE 22.04和24.04&#xff0c;在显示器设置200%放大的情况下&#xff0c;显示错位。 显示器配置&#xff1a; WPS显示错位&#xff1a; 这个问题当前没有找到好的解决方式。 因为4K显示屏设置4K分辨率&#xff0c;图标&#xff0c;字体太小&#xff…

TCP(TCP客户端、服务器如何通信)

一、TCP介绍 TCP的特点&#xff1a; 面向连接的协议&#xff1a;TCP是一种可靠的、面向连接的协议&#xff0c;在通信之前需要建立连接&#xff0c;以确保数据的可靠传输。这意味着在传输数据之前&#xff0c;发送方和接收方之间需要建立一条可靠的连接通道。流式协议&#x…

Spring Cloud架构进化实操:Eureka、Apollo、OpenFeign、Ribbon、Zuul组件

文章目录 前言一、引出二、服务注册与发现2.1 创建Eureka注册中心2.1.1 引入pom依赖2.1.2 配置yaml2.1.3 启动服务21.4 测试访问 2.2 创建服务提供者2.2.1 配置yaml2.2.2 启动服务2.2.3 测试访问 2.3 创建服务消费者2.3.1 服务提供者接口2.3.2 服务消费者调用接口 三、负载均衡…

Docker的私有仓库部署-Harbor

目录 一. Docker原生私有仓库 Registry 1. Registry 的介绍 2. Registry 的部署过程 二. Registry 的升级——Habor 1. Harbor 简介 2. Harbor 特性 3. Harbor 的构成 4. Harbor 部署 4.1 部署 Docker-Compose 服务 4.2 部署 Harbor 服务 4.2.1 下载或上传 Harbor…

18_Scala面向对象编程trait

文章目录 trait1.定义trait2.向类中混入特质2.1没有父类2.2有父类 3.动态混入3.1动态混入查询功能到公司业务中 4.父类&#xff0c;子类&#xff0c;特质初始化优先级5.Scala功能执行顺序6.常用API trait –特质的学习需要类比Java中的接口&#xff0c;源码编译之后就是interf…
最新文章