WebGL+Three.js入门与实战(一)——1.5 修改点的颜色

设置精度

		precision mediump float;

提示:⾼精度:highp, 低精度:lowp

添加 uniform 变量,设置到颜色上

const FRAGMENT_SHADER_SOURCE = `
		precision mediump float;
		uniform vec2 uColor;
		void main(){
			 gl_FragColor = vec4(uColor.r, uColor.g, 0.0,1.0); // vec4
		}
		`; //片元着色器

提示:片元着色器、顶点着色器都能设置uniform

获取 uniform 变量存储地址

const uColor = gl.getUniformLocation(program, 'uColor')

gl.getUniformLocation(program, name)
此方法使用和⼊参与 gl.getAttribLocation 相同
program: 包含顶点和⽚元着⾊器的程序对象
name: uniform 变量的名称

给uniform 变量赋值

 gl.uniform4f(uColor, 1.0,0.0,0.0,1.0)

gl.uniform4f(location, v0, v1, v2, v3)
location:指定 uniform 的存储地址
v0:第⼀个分量的值
v1:第二个分量的值
v2:第三个分量的值
v3:第四个分量的值

uniform4f() 同族函数介绍

gl.uniform1f(location, v0)
gl.uniform2f(location, v0, v1)
gl.uniform3f(location, v0, v1, v2)
gl.uniform4f(location, v0, v1, v2, v3)

代码案例

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="../lib/index.js"></script>
		<style>
			*{
				margin: 0;
				padding: 0;
			}
			canvas{
				margin: 50px auto 0;
				display: block;
				background: yellow;
			}
		</style>
	</head>
	<body>
		<canvas id="cancas" width="400" height="400"></canvas>
	</body>
	<script>
		const ctx = document.getElementById('cancas')
		const gl = ctx.getContext('webgl')
		//着色器
		//创建着色器源码
		const VERTEX_SHADER_SOURCE = `
		 uniform vec4 uPosition;
		 //必须要存在 main 函数
		 attribute vec4 aPosition;
		 void main() {
			 //要绘制的点的坐标
			 gl_Position = aPosition; //默认为 vec4(0.0,0.0,0.0,1.0);
			 //点的大小
			 gl_PointSize=10.0;
		 }
		 `; //顶点着色器
		const FRAGMENT_SHADER_SOURCE = `
		precision mediump float;
		uniform vec2 uColor;
		void main(){
			 gl_FragColor = vec4(uColor.r, uColor.g, 0.0,1.0); // vec4
		}
		`; //片元着色器
		//执行绘画
		const program=initShader(gl,VERTEX_SHADER_SOURCE,FRAGMENT_SHADER_SOURCE)
		// 获取attribute变量
		const aPosition=gl.getAttribLocation(program,'aPosition')
		const uColor = gl.getUniformLocation(program, 'uColor')
		const points=[];
		// 通过点击绘制多个点
		ctx.onclick=function(ev){
			//坐标
			const x =ev.clientX
			const y=ev.clientY
			const domPosition= ev.target.getBoundingClientRect()
			console.log(domPosition,ctx.offsetTop,ctx.offsetLeft)
			const domx=x-domPosition.left;
			const domy=y-domPosition.top;
			/*
			画布的宽度是400,对应的画布坐标系
			0 200 400
			webgl对应的X坐标系
			-1 0 1
			把画布X坐标系转化成webgl对应的坐标系
			需要先 -200 (当前画布的宽度)然后再除以200
			画布的高度是400,对应的画布坐标系
			0 200 400
			webgl对应的Y坐标系
			1 0 -1
			把画布Y坐标系转化成webgl对应的坐标系
			需要先让200(当前画布的高度) 减这个数,然后再/200
			*/
		   const halfWidth=ctx.offsetWidth/2
		   const halfHeight=ctx.offsetHeight/2
		   const clickX=(domx-halfWidth)/halfWidth
		   const clickY=(halfHeight-domy) / halfHeight
		   points.push({clickX,clickY})
		   for(let i=0;i<points.length;i++)
		   {
			   gl.vertexAttrib2f(aPosition,points[i].clickX,points[i].clickY)
			   gl.uniform2f(uColor, points[i].clickX, points[i].clickY)
			   gl.drawArrays(gl.POINTS, 0, 1);
		   }
		 
		}
	</script>
</html>

总体流程

在这里插入图片描述

代码中的initShader方法是自己封装好的方法
请参考https://blog.csdn.net/qq_45013951/article/details/134637108
下面是WebGL+Three.js入门与实战的总体链接
1.1 绘制一个点
1.2 webgl坐标系
1.3 学习使用attribute变量-绘制一个水平移动的点
1.4 通过鼠标控制绘制
1.5 修改点的颜色
1.6 实现贪吃蛇游戏
2.1 使用缓冲区对象-绘制多个点

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值