前端图形学篇为随手记,在学习推进过程会根据个人了解进行二次修改,文章中的观点可能来自看到的各个网站书籍,存在的错误或不完善的地方请谅解

It's not what you look at that matters, it's what you see.
重要的不是你正看着的是什么,而是你从中所看到的是什么。——亨利·戴维·梭罗

顶点

顶点是指二维或三维空间中的一个点,比如二维或者三维图形的端点或交点

片元

可以了解成像素,但包括大小、颜色、光源等元素。

顶点着色器(Vertex shader) 用于描述顶点特征(如位置、颜色等)的程序,它能改变几何形状的位置。它处理每个顶点的数据,例如顶点坐标,法线,色彩,和纹理坐标。

片元着色器(Fragment shader)进行逐片元处理过程如光照的程序

例子中绘制一个10像素大小的点

着色器采用GLSL ES编程语言,其是OpenGL中GLSL全称是 Graphics Library Shader Language (图形库着色器语言)的一个子集,但其采用类C的写法并不难理解。

注意:
GLSL ES是大小写敏感的强类型语言,语句必须以分号(;)结束

GLSL ES是从main()函数开始执行,程序只能有一个mian()函数

顶点着色器指定点的位置及大小

var VSHADER_SOURCE =

'void main() {\n}' +

' gl_Position = vec4(0.0, 0.0, 0.0, 1.0)\n' + //齐次坐标,浮点数,必须

' gl_PointSize = 10.0;\n' + //浮点数,非必须,默认为10.0

'}\n';

片元着色器指定点的颜色

var FSHADER_SOURCE =

'void main() {\n}' +

' gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0)'\n' +

'}\n';

着色器以JavaScript字符串形式编写,主程序就可以将其传给webGL进行编译

初始化着色器

辅助函数initShaders()对字符串编写的着色器进行初始化

initShaders(gl, vshader, fshader)
参数
gl 指定渲染的上下文
vshader 指定顶点着色器字符串
fshader 指定片元着色器字符串
返回值
true 初始化着色器成功
false 初始化着色器失败

注意:着色器运行在webGL中,而不是在javascript中。

完整代码

var VSHADER_SOURCE =
'void main() {\n}' +
' gl_Position = vec4(0.0, 0.0, 0.0, 1.0)\n' +
' gl_PointSize = 10.0;\n' +
'}\n';
var FSHADER_SOURCE =
'void main() {\n}' +
' gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0)\n' +
'}\n';
function main () {
// 获取节点元素
var canvas = document.getElementById('webGL');
// 获取webgl上下文
var gl = getWebGLContext(canvas);
if (!gl) {
console.log('Failed to get the rendering context for webgl');
return;
}
// 初始化着色器
if (!initShaders(gl, VSHADER_SOURCE, FSHADER_SOURCE)) {
console.log('Failed to init shaders');
return;
}
// 设置背景色
gl.clearColor(0.0, 0.0, 0.0, 1.0);
//清空
gl.clear(gl.COLOR_BUFFER_BIT);
//绘制
gl.drawArrays(gl.POINTS, 0, 1);
}

JavaScript和着色器间的数据通信

WebGL程序将顶点的位置坐标从JS传到着色器,然后在对于位置上进行绘制。

attribute变量 传输的是顶点相关的数据,全局变量,只能用在顶点着色器

uniform变量 传输的是对于所有顶点都相同的数据,全局变量,如颜色

varying变量 是从顶点着色器向片元着色器传输数据,须在两种着色器中共同声明

主要步骤:

1.着色器中声明attribute变量

'attribute vec4 a_Position;\n' +复制代码

<存储限定符><类型><变量名>

词attribute为存储限定符,声明成全局变量


2.获取attribute变量的位置,赋值js中的变量

var a_Position = gl.getAttribLocation(al.program, 'a_Position');复制代码

3.对attribute变量进行赋值

gl.vertexAttrib3f(a_Position, 0.0, 0.0, 0.0);复制代码

vertexAttrib3f(location, v1, v2, v3)作为传值函数,第一个参数为传值参数的地址,后面为传递的数值
同理,存在
vertexAttrib1f(location, v1)
vertexAttrib2f(location, v1, v2)
vertexAttrib4f(location, v1, v2, v3, v4)
vertexAttrib3f中的3f为参数个数+参数类型,“f”为浮点数,“i”为整数
复制代码

以上步骤可以动态设置webgl着色器的参数,因此这里就可以构成用户与图形交互的一个基础,如鼠标移动,获取移动的轨迹点,并通过attribute赋值着色器进行绘制。 相对应,如果需要对片元着色器进行处理,则使用uniform进行声明,getUniformLocation获取变量存储地址,uniform4f传输数据。

齐次坐标

通过(x, y, z, w)描述,等价于三维坐标上的(x/w, y/w, z/w),w为齐次坐标系中度量分量,当w为1时等同三维坐标系。

转载于:https://juejin.im/post/5cb57bd4f265da03b36edd1f

前端之图形学-2 着色器相关推荐

  1. Unity 3D 图形学 Shader之顶点与片段着色器(五)

    通过实现一个只有颜色属性可调节的简单材质效果更好的了解顶点与片段着色器 一.顶点着色器 顶点着色器就是处理顶点的着色器,每个顶点都会执行一次顶点着色器.我们先认识下顶点函数的结构: 顶点着色器函数的名 ...

  2. 图形学应用_着色器实例—笔刷效果

    笔刷效果的实现 最终效果: 片元着色器代码: Shader "Hidden/Brush" {Properties{_MainTex("MainTex",2D)= ...

  3. 【 Threejs 】- Shader 着色器实例渲染教程

    着色器在threejs中是一个难点,话不多说,先来看看着色器是什么? 如果您已经有使用计算机绘图的经验,您就会知道在这个过程中您先画一个圆,然后画一个矩形.一条线.一些三角形,直到您组成您想要的图像. ...

  4. 从头开始学习Unity着色器

    MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz,2 Ch 语言:英语+中英文字幕(根据原英文字幕机译更准确)|时长:56节课(4h 26m) |大小解压后:2.89 GB ...

  5. 【OPENGL】第三篇 着色器基础(一)

    在这一章,我们会学习什么是着色器(Shader),什么是着色器语言(OpenGL Shading Language-GLSL),以及着色器怎么和OpenGL程序交互. 首先我们先来看看什么叫着色器. ...

  6. 【计算机图形学】着色简介

    文章目录 前言 光照模型 纹理 前言 来源:GAMES101-现代计算机图形学入门-闫令琪 这里简单记录下. 我不知道这个理解对不对.着色(shading)可以分为两部分:光照模型+纹理映射.即:输入 ...

  7. OpenGL超级宝典(第7版)笔记11 帧缓存运算 计算着色器 清单 3.13

    OpenGL超级宝典(第7版)笔记11 帧缓存运算 计算着色器 清单 3.13 文章目录 OpenGL超级宝典(第7版)笔记11 帧缓存运算 计算着色器 清单 3.13 1 帧缓存运算 1.1 裁剪测 ...

  8. VTK 学习----3D基础知识-着色器和图形管道

    2.5 着色器和图形管道 2.5.1 图形管道 在三维绘图引擎中,一切物体都在三维空间,但屏幕和窗口是2D像素阵列,因此三维引擎的大部分工作是将所有3D坐标转换为合适屏幕的2D像素.将3D坐标转换为2 ...

  9. 曲面细分着色器---细分二维四边形

    openGL系列文章目录 文章目录 openGL系列文章目录 前言 一.曲面细分 二.细分二维四边形 参考 前言 术语Tessellation(镶嵌)是指一大类设计活动,通常是指在平坦的表面上,用各种 ...

最新文章

  1. 中文按拼音首字母排序的C++实现方案
  2. Leetcode 51. N 皇后 (每日一题 20211008)
  3. python中二维数组如何按索引找元素_按索引或坐标访问二维数组中的元素
  4. 【SpringBoot零基础案例06】【IEDA 2021.1】多环境下.properties配置文件的使用
  5. Java Properties的使用
  6. Catalog Service - 解析微软微服务架构eShopOnContainers(三)
  7. VARIANT变体类型数据
  8. 现任明教教主CCNP Security Secure第十一天视频共享
  9. 四个跑马灯的c语言程序,入门编程语言跑马灯,C语言设计跑马灯程序
  10. leaflet中文文档
  11. 【量化金融】利用DCF估值模型实现股票价值监测
  12. led点阵c语言程序,51单片机驱动LED点阵扫描显示C语言程序
  13. phpstorm php代码补全,基本代码补全:补全名称和关键字
  14. 做到这3点,你也能成为一个高情商的人
  15. 检索器与阅读器:开放域问答的综述 Retrieving and Reading: A Comprehensive Survey on Open-domain Question Answering
  16. 如何实现一个漂亮的微信小程序朋友圈、表白墙、校内圈(后台篇)
  17. 软件项目接单渠道丨软件公司项目接单平台
  18. 吃鸡神器!新款苹果 iPad,免费送一台!
  19. 从零开始创建自己的区块链应用(JAVA版)
  20. 安装VMware的VM Tools

热门文章

  1. 英特尔推深度学习加速工具包OpenVINO,布局边缘计算,发力物联网业务
  2. java-jwt这个库没用过吧?
  3. 推荐:一款Java开源的Springboot 即时通讯 IM 聊天系统
  4. 到底什么级别才算是高并发?
  5. 计算机科学和Python编程导论(六) 测试与调试
  6. 字节跳动AI Lab 再失大将!大牛王长虎被爆已离职回归学界!
  7. 两大顶级 AI 算法一起开源!Nature、Science 齐发 Alphafold2 相关重磅,双厨狂喜~...
  8. 刚刚,三名中国航天员奔赴太空!其中一位刚参加完博士毕业典礼!
  9. 如何在Colab上实现近200万图片的精准检索匹配?
  10. 数百个CV实战项目与必备7本书5000页中英文CV书籍以及算法工程师必备资料免费送啦~...