传递世界坐标系和摄像机坐标系到shader

2023-11-14

<html>
<head>11</head>
<body>
<canvas id = "test" width = "200" height = "200">canvas </canvas>
<script src = "webgltest/cuon-matrix.js"></script>
<script >
//顶点着色器
var vertexShaderSource =
    'attribute vec4 a_Position;\n' +
    'attribute vec4 a_Color;\n' +
    'uniform mat4 u_ViewMatrix;\n' +
    'uniform mat4 u_ModelMatrix;\n' +
    'varying vec4 v_Color;\n' +     //varying变量
    'void main() {\n' +
    'gl_Position = u_ViewMatrix *u_ModelMatrix* a_Position;\n'+  //设置坐标
    'v_Color = a_Color;\n' + //将数据传给片元着色器
    '}\n';

//片元着色器
var fragmentShaderSource =
    'precision mediump float;\n' +
    'varying vec4 v_Color;\n' +     //varying变量
    'void main() {\n' +
    'gl_FragColor = v_Color;\n'+ //设置颜色
    '}\n';

//创建着色器方法,输入参数:渲染上下文,着色器类型,数据源
function createShader(gl, type, source)
{
    //创建着色器对象
    var shader = gl.createShader(type);
    //提供数据源
    gl.shaderSource(shader,source);
    //编译着色器
    gl.compileShader(shader);
    //链接
    var success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
    if(success)
    {
        return shader;
    }
    console.log(gl.getShaderInfoLog(shader));
    gl.deleteShader(shader);
    
}
//将顶点着色器和像素着色器链接到一个着色程序
function createProgram(gl, vertexShader, fragmentShader)
{
    var program = gl.createProgram();
    gl.attachShader( program, vertexShader);
    gl.attachShader( program, fragmentShader);
    gl.linkProgram( program );
    var success = gl.getProgramParameter(program, gl.LINK_STATUS);
    if(success)
    {
        console.log("link right");
        return program;
    }
    console.log(gl.getProgramInfoLog(program));
    gl.deleteProgram(program);
}
    var canvas = document.getElementById("test");
    //创建webgl渲染上下文
    var gl = canvas.getContext("webgl");
    //var gl = WebGLUtils.setupWebGL(canvas);
    if(!gl)
    {
        console.log("wrong");
    }
    else
    {
        console.log("right");
    }
    //初始化着色器

    var vertexShader = createShader(gl,gl.VERTEX_SHADER,vertexShaderSource);
    var fragmentShader = createShader(gl,gl.FRAGMENT_SHADER, fragmentShaderSource);
    var program = createProgram(gl, vertexShader, fragmentShader);
    gl.useProgram(program);
    //创建顶点数组
    var vertices = new Float32Array([
    0.0, 0.5,  1.0,0.0, 0.0, 0.1,      //第一个点
    -0.5, -0.5, 0.0,1.0, 0.0,0.3,    //第二个点
    0.5, -0.5, 0.0, 0.0, 1.0,0.5,    //第三个点
    ]);
    var numberVertices = 3;
    //创建缓冲区对象
    var vertexBuffer = gl.createBuffer();
    //将缓冲区对象绑定到目标
    gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
    //向绑定的缓冲区对象中写入数据
    gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
    
    var FSIZE = vertices.BYTES_PER_ELEMENT;
    //获取位置变量并传递顶点位置
    var thePosition = gl.getAttribLocation(program, 'a_Position');
    //将缓冲区对象分配给位置变量
    gl.vertexAttribPointer(thePosition, 2, gl.FLOAT, false, FSIZE * 6, 0 );
    //启动缓冲区
    gl.enableVertexAttribArray(thePosition);
    
    var theColor = gl.getAttribLocation(program, 'a_Color');   
    gl.vertexAttribPointer(theColor, 3, gl.FLOAT, false, FSIZE * 6, FSIZE * 2 );    
    gl.enableVertexAttribArray(theColor);
 
    //世界坐标系
    var u_ModelMatrix = gl.getUniformLocation(program, 'u_ModelMatrix');
    var modelMatrix = new Matrix4();
    modelMatrix.setRotate(10.0,0,0,1);
    gl.uniformMatrix4fv(u_ModelMatrix, false, modelMatrix.elements);
    //获取摄像机矩阵
    var u_ViewMatrix = gl.getUniformLocation(program, 'u_ViewMatrix');
    //设置视点、视线和上方向
    var viewMatrix = new Matrix4();
    viewMatrix.setLookAt(0.20, 0.25, 0.25, 0, 0, 0, 0, 1, 0);
    //将视图矩阵传给u_ViewMatrix变量
    gl.uniformMatrix4fv(u_ViewMatrix, false, viewMatrix.elements);
    //清除颜色
    gl.clearColor(0.0,0.0,0.0,1.0);
    gl.clear(gl.COLOR_BUFFER_BIT);
    //绘制点
     gl.drawArrays(gl.TRIANGLES, 0, numberVertices);

    
    </script>
</body>
</html>

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

传递世界坐标系和摄像机坐标系到shader 的相关文章

  • [前端系列第6弹]Ajax简明教程:轻松实现Web页面的异步交互

    在这篇文章中 我将介绍Ajax的基本概念 原理 优缺点 实现方法和应用场景 以及如何使用它来实现Web页面的异步交互 还将给一些简单而实用的例子 让你可以跟着我一步一步地编写自己的Ajax代码 目录 一 什么是Ajax 二 如何使用Ajax
  • gdb调试多进程程序和多线程程序

    gdb调试多进程程序和多线程程序 平时一般用gdb直接调试短小的程序 好像我还没调试过多进程和多线程程序呢 1 gdb调试多进程程序 如果一个进程通过fork系统调用创建了子进程 gdb会继续调试原来的进程 子进程则正常运行 常用的有两种方
  • win10设置任务栏双屏不同位置(方向)

    在所有显示器上显示任务栏开 任务栏在屏幕的位置 底部 在所有显示器上显示任务栏 任务栏在屏幕的位置靠右 在所有显示开 win10双屏设置任务栏位置方向 哔哩哔哩 bilibili
  • 重定义;多次初始化(C++报错)

    C 中报错 b 重定义 多次初始化 如图 将a b c前面的int数据类型去掉即可
  • SpringMvc,全面讲解@RequestParam注解的用法和原理

    本文要讲的 RequestParam注解大家在开发中应该会经常的用到 但是它的某些用法我感觉你不一定都知道 所以这篇文章就讲解一下带大家拨开云雾全面了解这个注解 使大家在开发中使用到这个注解的时候不再一知半解 先看一下 RequestPar
  • 生活服务是未来十年最大的商业机会?

    编者按 本文来自有邻的投稿 内容来自有邻创始人杨仁斌周末在杭州一个 O2O 活动上的分享 文章主要是杨仁斌对于 O2O 和生活服务的一些观点分享 最后一个部分中介绍了他们自己家的 有邻 提及的数据等资料 36 氪不作背书 我的第一个观点是
  • OpenWrt系统配置UCI

    UCI简介 UCI Unified Configuration Interface 是 Openwrt 中的统一配置接口 官方文档参考 每一个程序的配置文件都保存在 etc config 目录 可以通过文本编辑器 uci 一个可执行程序 以
  • 2022年社区工作人员社区专职工作者考试精选套卷及答案

    题库来源 优题宝公众号 2022年社区工作人员社区专职工作者考试精选套卷及答案 根据最新社区工作人员社区专职工作者考试大纲与历年社区工作人员社区专职工作者考试真题汇总编写 包含社区工作人员社区专职工作者考试常考重点题型与知识点 有助于考生复
  • Metal 系列教程

    这系列文章 目前发布在我的小专栏 iOS 图像处理 上 欢迎订阅 从 2014 年 Apple 正式推出 Metal 到现在 这个 Metal 系列教程 酝酿了很久 却迟迟没有进展 直到 WWDC 2018 Apple 宣布 iOS 12
  • 社工库网址与制作方法

    将互联网泄露的信息汇聚成数据库 简单说 黑客数据库 中国执行信息公开网 http zxgk court gov cn dt dapp 1 全国标准信息公共服务平台 http std samr gov cn 征信中心 https ipcrs

随机推荐

  • arm启动redis报错

    报错如下 WARNING you have Transparent Huge Pages THP support enabled in your kernel This will create latency and memory usag
  • 从BOM,DOM和ECMAScript来看JavaScript

    一个老套的问题 JavaScript是由什么组成的 答 1 ECMAScript 核心 描述JS的语法和基本对象 2 文档对象模型 DOM 处理网页内容的方法和接口 3 浏览器对象模型 BOM 与浏览器交互的方法和接口 ECMAScript
  • adb logcat命令查看并过滤android输出log

    http blog csdn net hansel article details 38088583 cmd命令行中使用adb logcat命令查看Android系统和应用的log dos窗口按ctrl c中断输出log记录 logcat日
  • mysql之服务的停止和开启,登录和退出01

    1 服务的停止和开启 登录和退出 1 mysql服务的停止和开启 net stop 服务名 例如net stop MYSQL56 服务名字通过右击电脑 管理 服务和应用程序 服务获取 net start 服务名 2 MYSQL服务的登录和退
  • 抖音私信卡片私信名片的原理分析

    抖音私信卡片 解决了客户封号严重 引流效率低的痛点 所以从去年到现在 依然是热销品 抖音快手私信名片链接跳转 是2022年抖音快手引流最新技术 可以生成卡片链接 支持标题 描述 logo以及跳转落地页的完全自定义配置 支持微信公众号和微信号
  • JS对象类型的确定

    http liaofeng xiao iteye com blog 697029 JS是松散类型的语言 这一点JS的对象表现得尤为突出 那么如何来确定JS对象的具体类型呢 首先 我们可以使用typeof运算符确定其基本类型 number o
  • PHPWord 实现合并多个word文件(完结)

    PHPWord 本来想着当调包侠呢 结果翻了一遍文档 没有这种操作支持 阿这 GPT 不出意外的一顿胡扯 给 气的要中风啦 思路 word 也就是docx结尾的文件本质上就是xml字符串 两个word文件合并其实就是把两个字符串拼接起来 你
  • 一文带你理解URI 和 URL 有什么区别?

    当我们打开浏览器 要访问一个网站或者一个ftp服务器的时候 一定要输入一串字符串 比如 https blog csdn net 或者 ftp 192 168 0 111 这样我们就可以得到一个html格式的页面或者一个文件 那么这个地址是什
  • YOLO论文思路简析

    YOLO You Only Look Once Unified Real Time Object Detection 是一种2016年提出的用于视觉检测的算法 与之前的算不同 YOLO改变了检测的过程将检测转化为了一个回归问题 输出目标的b
  • Capturing iteration variables

    首先要理解Lambda表达式的延迟执行 Deferred execution An important feature of most query operators is that they execute not when constr
  • 九大遥感目标检测数据集(附下载链接)

    遥感领域目标检测数据集 码字不易 点个赞再走呗 1 UCAS AOD 3 25G 1 1基本信息 UCAS AOD Zhu et al 2015 用于飞机和汽车的检测 包含飞机与汽车2类样本以及一定数量的反例样本 背景 总共包含2420幅图
  • Linux 进程通信-共享内存Shmem示例

    linux系统共享内存是进程间共享数据最快的方法 一个进程向共享内存区域写入了数据 共享这个内存区域的所有进程就可以立刻看到其中的内容 共享内存由shmget shmat shmdt shmctl四个函数组成 具体使用说明 可以请教男人 m
  • 剑指Offer - 面试题22:链表中倒数第K个节点

    题目 输入一个链表 输出该链表中倒数第K个节点 为了和服大多数人习惯 本题从1开始计数 即链表的尾节点是倒数第1个节点 例如 一个链表有6个节点 从头节点开始 它们的值依次是1 2 3 4 5 6 这个链表的倒数第3个节点是值为4的节点 链
  • ERR_CONNECTION_RESET的出现的可能原因之一

    网页或者接口出现ERR CONNECTION RESET 原因可能和你的服务器配置 代码 http协议没有一毛钱关系 如果你的代码里出现了vpn falungong等等字眼 你懂得 你的网页就会被国内的服务器厂商以各种各样离奇的理由封掉 所
  • 分布式系统全链路监控方案设计

    分布式系统全链路监控方案设计 在分布式系统中 全链路监控系统 跟踪requestid经过了哪些server 方便定位log的位置 能在一定程度上缓解维护压力 下面给出我们团队的架构设计图
  • 【ClickHouse 技术系列】- ClickHouse 中的嵌套数据结构

    前言 本文翻译自 Altinity 针对 ClickHouse 的系列技术文章 面向联机分析处理 OLAP 的开源分析引擎 ClickHouse 因其优良的查询性能 PB 级的数据规模 简单的架构 被国内外公司广泛采用 阿里云 EMR OL
  • Opengles 2.0 错误 called unimplemented OpenGL ES API

    在使用Android进行opengl es进行开发时 可能会出现这个called unimplemented OpenGL ES API错误 图也没绘出来 如果确定你的模拟器或者真机支持opengl es 并且支持相关版本时 采用2 0时报
  • php 七牛上传图片,七牛云如何上传图片

    七牛云上传图片的方法 1 注册七牛云账号 2 创建一个存储空间bucket 创建的时候回送一个临时的测试域名 这个等上传工具类要用到 有效期30天 3 写java工具类public class upLoadFile 生成上传凭证 然后准备上
  • maven打包生成source.jar

    开发十年 就只剩下这套Java开发体系了 gt gt gt 1 生成source jar mvn source jar 2 生成jar和souce jar mvn clean install source jar Dmaven test s
  • 传递世界坐标系和摄像机坐标系到shader

    11