1.å¨Reactä¸ä¸ºä»ä¹è¦ç¨JSXï¼
2.OpenGL 着色器详解
å¨Reactä¸ä¸ºä»ä¹è¦ç¨JSXï¼
èµ·å
大家好ï¼ææ¯ç±åé±¼ç桶å¥Zãç¸ä¿¡ä½¿ç¨Reactå¼åçç«¥éï¼å¨ç¼åç»ä»¶çè¿ç¨ä¸æ¥è§¦æå¤çå°±æ¯JSXãé£ä¹ä¸ºä»ä¹Reactè¦ç¨JSXæ¥ç¼åç»ä»¶å¢ï¼JSXçæ¬è´¨æ¯ä»ä¹ï¼æ¯ä¸æ¯åªæReactæè½ç¨JSXï¼é对è¿å 个é®é¢ï¼ä»å¤©æ们就ä¸èµ·æ¥å¦ä¹ ä¸ä¸å§ã
JSXJSXå¨å®ç½ç解éæ¯ï¼å®æ¯ä¸ç§JavaScriptè¯æ³çæ©å±ï¼å¹¶ä¸å®å ·æJavaScriptçææç¹æ§ãå¦ææ人é®ä½ 为ä»ä¹Reactä¸è¦ä½¿ç¨JSXï¼å ¶å®æ¬è´¨æ¯é®ä½ 为ä»ä¹ä¸ç¨å ¶å®çæ¹æ¡æ¥å®ç°ï¼ä¸ºä»ä¹ååæ¯JSXï¼
é¦å ï¼æ们å¨åé¢ä¹äºè§£å°JSXæ¬è´¨æ¯JavaScriptçè¯æ³æ©å±ï¼å ¶æ¬¡ï¼å¨Reactçå¼åä¸ï¼React并ä¸æ¯å¼ºå¶è¦æ±ä¸å®è¦ä½¿ç¨JSXï¼æ们å®å ¨å¯ä»¥éè¿React.createElementæ¥å建Reactç»ä»¶ï¼ç±»ä¼¼ä¸é¢è¿æ ·ï¼
render(){ returnReact.createElement("div",属性属性null,"Hello",this.props.name);}èæ们éè¿JSXç¼åçç»ä»¶ï¼ç¸å¯¹React.createElementæ¥è¯´å°±è¦ç®æ´æäºè®¸å¤ï¼åæ ·çç»ä»¶ï¼ç¼åèµ·æ¥ä¼æ´ä¸ºç®æ´ï¼å¹¶ä¸ä»£ç çå±æ¬¡ä¹ä¼æ´å çæ¸ æ°ï¼ç±»ä¼¼ä¸é¢è¿æ ·ï¼
render(){ return<div>Hello{ this.props.name}</div>;}å½æ们使ç¨JSXå°ç»ä»¶ç¼åå®æåï¼Reactå é¨éè¦å°ç»ä»¶è½¬å为DOMæ ï¼çèµ·æ¥å°±åXMLä¸æ ·ãèXMLå¨æ ç»æçæè¿°ä¸å¤©çå°±å ·æå¯è¯»æ§å¼ºçä¼å¿ã
è½ç¶æ们æ¯éè¿JSXæ¥ç¼åç»ä»¶ï¼ä½æ¯æç»Reactè¿æ¯ä¼éè¿babelå°JSXç¼è¯ä¸ºjså¯æ§è¡ç代ç ãæ们ä¹æ以ä¸ç´æ¥ç¨React.createElementæ¥å建ç»ä»¶ï¼å¨åé¢ä¹å·²ç»è¯´æäºåå ï¼è¿éå°±ä¸åèµè¿°äºã
å 为æ们ç¥éæç»ç代ç ä¼éè¿babelç¼è¯æjså¯ç´æ¥æ§è¡ç代ç ï¼å æ¤JSXä¸ä» è½å¨Reactä¸è¿è¡ä½¿ç¨ï¼åæ ·å¨Vueä¸ä¹å¯ä»¥ä½¿ç¨JSXæ¥ç¼åç»ä»¶ã并ä¸ä½¿ç¨JSXç¼åçç»ä»¶ä¹å¯ä»¥ç¨äºè·¨ç«¯åºç¨ç渲æï¼ä¾å¦React-Nativeä¸ä½¿ç¨çç»ä»¶ç»æè·Reactç»ææ¯ä¸æ ·çã
æ©å±å¨ä¸é¢æ们ä»ç»äºJSXæç»ä¼éè¿babelç¼è¯ä¸ºjså¯æ§è¡ç代ç ï¼é£ä¹Babelæ¯å¦ä½å®ç°JSXå°jsçç¼è¯å¢ï¼æ们å¯ä»¥éè¿æ¥çç¸å ³çæºç æ¥äºè§£ä¸ä¸ï¼æºç å¦ä¸ï¼
module.exports=function(babel){ vart=babel.types;return{ name:"custom-jsx-plugin",visitor:{ JSXElement(path){ varopeningElement=path.node.openingElement;vartagName=openingElement.name.name;varargs=[];args.push(t.stringLiteral(tagName));varattribs=t.nullLiteral();args.push(attribs);varreactIdentfier=t.identifier("React")ï¼varcreateElementIdentifier=t.identifier("createElement");varcallee=t.memberExpression(reactIdentfier,createElementIdentifier);varcallExpression=t.callExpresion(callee,args);callExpression.arguments=callExpression.arguments.concat(path.node.children);path.replaceWith(callExpression,path.node);},},};}æåæ们éè¿å¦ä¹ äºè§£å°Reactä¸éç¨JSXçåå ï¼ä»¥åJSXçæ¬è´¨æ¯ä»ä¹ï¼ä¹äºè§£å°babelæ¯å¦ä½å°JSXç¼è¯ä¸ºjså¯æ§è¡ç代ç ãå¦æä½ å¯¹babelçç¼è¯æå ´è¶£ï¼å¯ä»¥å°babelå®æ¹ç½ç«è¿è¡æ¥çåå¦ä¹ ã
OpenGL 着色器详解
GLSL语言
GLSL(OpenGL Shading Language)专用于编写着色器,通过定义main函数的源码程序片段,指导渲染引擎渲染内容。属性属性
GLSL语法类似C语言,源码增加特定关键字修饰变量。属性属性燃鹅代跑源码基本结构如下:声明GLSL版本、源码幸运28竞猜 源码模式、属性属性变量,源码主函数main处理输入输出。属性属性
输入变量in
GLSL允许有限输入变量,源码硬件决定数量,属性属性可通过GL_MAX_VERTEX_ATTRIBS查询上限。源码
输出变量out
片段着色器直接输出色值,属性属性源码上传到哪无需与后续阶段关联。源码可通过一致数据类型和名称建立顶点着色器到片段着色器间联系。属性属性
全局变量
全局变量作用于整个着色器程序,可在多个着色器间共享,qgc源码官网通过GL编码获取。
示例:片段着色器中使用全局变量。
顶点着色器与片段着色器
顶点着色器声明位置与颜色变量,片段着色器声明一致输入变量接收颜色,qml控件库源码实现数据传递。
数据类型
向量类型定义、重组用于复杂数据结构。
glVertexAttribPointer
设置顶点变量属性,定义步长、偏移与位置,用于配置顶点数据。
顶点数据、着色器配置
顶点着色器声明输入变量,片段着色器接收传递颜色,完成数据流。
着色器程序
着色器程序作为最小绘制单元,由两个着色器决定结果。面向对象封装着色器程序。
加载着色器代码梳理
流程包括:创建着色器对象、附加源码编译、创建程序、绑定与链接。
着色器程序类封装