首页 > 其他分享 >WebGL之贴图处理(基础)

WebGL之贴图处理(基础)

时间:2024-01-18 22:33:12浏览次数:23  
标签:贴图 const 处理 WebGL shader param program gl image

一,index.html

WebGL之贴图处理(基础)_WebGL

二,shader.js

/**
 * 加载图片
 * @param imageName
 * @param pork
 * @param callback
 */
function loadImage(imageName, pork, callback) {
	const image = new Image();
	image.src = "http://127.0.0.1:" + pork + "/WebGLDemo/textures/" + imageName;
	image.onload = () => {
		callback(image);
	};
}


function setTexture(gl, image) {
	const texture = gl.createTexture();
	gl.bindTexture(gl.TEXTURE_2D, texture);
	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); //gl.LINEAR
	gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); //gl.NEAREST
	gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);
}

function setRectangle(gl, x, y, width, height) {
	const x1 = x;
	const x2 = x + width;
	const y1 = y;
	const y2 = y + height;
	gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
		x1, y1,
		x2, y1,
		x1, y2,
		x1, y2,
		x2, y1,
		x2, y2,
	]), gl.STATIC_DRAW);
}


/**
 * 获得绘图上下文gl WebGLRenderingContext
 * @param {Object} width
 * @param {Object} height
 */
function getWebGLRenderingContext(width, height) {
	const canvas = document.createElement("canvas");
	document.getElementsByTagName("body")[0].appendChild(canvas);

	canvas.width = width;
	canvas.height = height;

	const gl = canvas.getContext("webgl");
	if (!gl) {
		console.log("%c不支持webgl", "color:#F00");
		return null;
	}
	return gl;
}

function getShaderSource(isVertex) {
	let source;
	if (isVertex) {
		source = document.querySelector("#vertex-shader-2d").text;
	} else {
		source = document.querySelector("#fragment-shader-2d").text;
	}
	return source;
}

/**
 * @param {Object} gl WebGLReanderingContext
 * @param {Object} type gl.VERTEX_SHADER/gl.FRAGMENT_SHADER
 * @param {Object} source source string
 */
function createShader(gl, type, source) {
	const shader = gl.createShader(type); //创建相关类型的shader
	gl.shaderSource(shader, source); //提供shader的资源
	gl.compileShader(shader); //编译shader
	const success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
	if (success) {
		return shader;
	}
	console.log(gl.getShaderInfoLog(shader));
	gl.deleteShader(shader);
}

/**
 * 链接(link)2个shader,得到着色程序program
 * @param {Object} gl WebGLReanderingContext
 * @param {Object} vertexShader 顶点着色器
 * @param {Object} fragmentShader 片段着色器
 */
function createProgram(gl, vertexShader, fragmentShader) {
	const program = gl.createProgram();
	gl.attachShader(program, vertexShader);
	gl.attachShader(program, fragmentShader);
	gl.linkProgram(program);
	const success = gl.getProgramParameter(program, gl.LINK_STATUS);
	if (success) {
		return program;
	}
	console.log(gl.getProgramInfoLog(program));
	gl.deleteProgram(program);
}

function render(gl, program, image) {
	const positionAttributeLocation = gl.getAttribLocation(program, "a_position");
	const texCoordAttributeLocation = gl.getAttribLocation(program, "a_texCoord");
	const resolutionUniformLocation = gl.getUniformLocation(program, "u_resolution");

	const positionBuffer = gl.createBuffer();
	gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
	setRectangle(gl, 0, 0, image.width, image.height); //矩形(2个三角形)


	const texCoordBuffer = gl.createBuffer();
	gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);
	gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
		0.0, 0.0,
		1.0, 0.0,
		0.0, 1.0,
		0.0, 1.0,
		1.0, 0.0,
		1.0, 1.0
	]), gl.STATIC_DRAW);

	//开始渲染
	gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);
	gl.clearColor(0, 0, 0, 0);
	gl.clear(gl.COLOR_BUFFER_BIT);

	gl.useProgram(program);
	// uniform: 设置全局属性
	gl.uniform2f(resolutionUniformLocation, gl.canvas.width, gl.canvas.height);


	gl.enableVertexAttribArray(positionAttributeLocation);
	gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
	const size = 2; //每次迭代运行提取2个单位数据
	const type = gl.FLOAT; //每个单位数据是32位的浮点数
	const normaliza = false; //不需要归一化数据
	const stride = 0; //0 = 移动单位数量 * 每个单位占用的内存(sizeof(type))
	const offset = 0; //每次迭代运行运动多少内存到下一个数据开始点,从缓冲起始位置开始读取
	gl.vertexAttribPointer(positionAttributeLocation, size, type, normaliza, stride, offset);

	gl.enableVertexAttribArray(texCoordAttributeLocation);
	gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);
	gl.vertexAttribPointer(texCoordAttributeLocation, 2, gl.FLOAT, false, 0, 0);


	setTexture(gl, image);


	const primitiveType = gl.TRIANGLES; //绘制三角形
	const pOffset = 0; //从第一个点开始绘制
	const count = 6; //绘制6个点(运行6次)
	gl.drawArrays(primitiveType, pOffset, count);
}

function main() {
	const WIDTH = 400;
	const HEIGHT = 300;
	const gl = getWebGLRenderingContext(WIDTH, HEIGHT);
	if (!gl) return;
	//#region 构建2个shader
	const vertexShader = createShader(gl, gl.VERTEX_SHADER, getShaderSource(true));
	const fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, getShaderSource(false));
	//#endregion

	//#region link2个shader
	const program = createProgram(gl, vertexShader, fragmentShader);
	//#endregiopn
	loadImage("cocos.png", 8848, (image) => {
		render(gl, program, image);
	});
}

main();

三,结果

WebGL之贴图处理(基础)_Cocos_02

标签:贴图,const,处理,WebGL,shader,param,program,gl,image
From: https://blog.51cto.com/aonaufly/9320725

相关文章

  • 2024-1-18文档处理
    目录文档处理文档处理添加到指定元素内部的后面$(A).append(B)//把B追加到A$(A).appendTo(B)//把A追加到B添加到指定元素内部的前面$(A).prepend(B)//把B前置到A$(A).prependTo(B)//把A前置到B添加到指定元素外部的后面$(A).after(B)//把B放到A的后面$(A).insert......
  • springmvc怎么进行异常处理
    局部异常处理局部异常处理是指当类中1发生异常时,由方法来处理,该方法的参数类型为Exception,而Exception是所有异常的父类,所以该参数来接受异常信息步骤说明1.在controller类中定义处理异常的方法,添加注解@ExceptionHandler,方法的擦桉树类型weiexception,并通过getMessage()方......
  • jmeter使用jdbc连接SQL server,执行SQL报错处理
    前置环境参数:jdk-8u391-windows-x64,驱动:sqljdbc4.jar备注:这是解决后的截图,将就用问题一:使用jmeter5.5,使用jdbc连接SQLserver,执行SQL报错处理,如下图 报错信息:java.lang.UnsupportedClassVersionError:com/microsoft/sqlserver/jdbc/SQLServerDriverhasbeencompiledby......
  • HBuilderX mac M1 打包 vite/vue3 报错处理办法(pnpm)
    项目运行h5的时候都没有问题,但是要运行到微信开发者工具的时候打包报11:40:54.480Specificallythe"esbuild-darwin-arm64"packageispresentbutthisplatform11:40:54.480needsthe"esbuild-darwin-64"packageinstead.Peopleoftengetintothis很好看去论......
  • 企业计算机服务器中了mkp勒索病毒如何处理,mkp勒索病毒解密
    网络技术的不断发展,为企业的生产运营提供了非常有利条件,但也为企业的数据安全埋下隐患,近期,众多企业的服务器遭到了mkp勒索病毒攻击,导致企业计算机服务器瘫痪无法正常工作,严重影响了企业正常生活运营。Mkp勒索病毒属于makop勒索家族,是新升级的加密程序,该勒索病毒具有较强的攻击与加......
  • 计算机服务器中了lockbit3.0勒索病毒如何处理,勒索病毒解密数据恢复
    近期,网络上的勒索病毒非常猖狂,给企业的生产运营带来了极大困难,网络技术的发展为企业的生产运营提供了极大便利,但也为企业的数据安全带来严重威胁。下面就为大家整理了以下有关lockbit3.0的处理建议。一,lockbit3.0勒索病毒特点攻击加密复杂。Lockbit3.0勒索病毒具有较强的攻击加密能......
  • 【Python】解压压缩包(处理中文乱码问题)
    支持中文编码fromzipfileimportZipFiledefsupport_gbk(zip_file):name_to_info=zip_file.NameToInfo#copymapfirstforname,infoinname_to_info.copy().items():real_name=name.encode('cp437').decode('gbk')......
  • uniapp开发——h5版本页面切换无法重置页面滚动状态的处理方案
    前言:使用vue开发h5的时候,都会使用vue-router的scrollBehavior函数处理页面滚动状态,代码如下:constrouter=newVueRouter({mode:"hash",routes,scrollBehavior(to,from,savePosition){if(savePosition&&to.meta.keepAlive){returnsavePosition;......
  • python创建httpserver,并处理get、post请求
    搭建一个简单的httpserver,用于测试数据通讯fromhttp.serverimportHTTPServer,BaseHTTPRequestHandlerimportjsondata={'result':'thisisatest'}host=('localhost',8888)classResquest(BaseHTTPRequestHandler):  defdo_GET(self):   ......
  • sql sever 表处理(增删改查等)
    -------------------------------------------------------------------------查--查找表里是否有某个字段:SELECT*FROMINFORMATION_SCHEMA.COLUMNSWHERECOLUMN_NAME='字段名'ANDTable_Namelike'[^V]%'-------------------------------------------------......