opengles3.0 学习,顶点着色器(六)

2023-11-14

opengles3.0 学习,顶点着色器(六)

        顶点着色器输入包括:

                  属性:  用顶点数组提供的逐顶点数据

                 统一变量和统一变量缓冲区:顶点着色器使用的不变数据

                  采样器:代表顶点着色器使用的纹理的特殊统一变量类型

                 着色器程序:顶点着色器的源码。

                顶点着色器的输出乘坐顶点着色器输出变量。再图元光栅化阶段,为每个生产的片段计算这些变量,并作为片段

                计算这些变量,并作为拍那段着色器的输入传入.

               顶点着色器的位置输入保存为物体坐标,而输出为裁剪坐标。

      

 

       内建特殊变量:

           gl_VertexID是一个输入变量,用于保存顶点的整数索引。

           gl_InstanceID是一个输入变量,用于保存实例化绘图调用中的图元的实例编号。

           gl_Position用于输出顶点位置的裁剪坐标。

           gl_PonitSize用于写入以像素表示的点精灵尺寸。

           gl_FrontFaceing是一个特殊的变量。

 

     内建统一状态:

            顶点着色器内可用的唯一内建统一状态是窗口坐标中的深度范围,这由内建统一变量名gl_DepthRange给出。

     

     内建常量:

 

 矩阵:

     组成MVP矩阵的每个单独矩阵执行的变换如下:

         模型矩阵:将物体坐标变为世界坐标

         视图矩阵:将世界坐标变为眼坐标

         投影矩阵:将眼睛坐标变为裁剪坐标

 

    模型-视图矩阵:

       模型和视图矩阵合并为一个矩阵,称做模型-视图矩阵

       这个4X4的矩阵将顶点位置从物体坐标变换为眼睛坐标,组合了从物体坐标到世界坐标和世界坐标到眼坐标的转换。再固定功能

       opengl中,模型-视图矩阵可以用glRotatef,glTra-nslatef和glScalef等函数的创建。因为这些函数再Opengles2.0或者3.0中是不存在的。

       因此这些矩阵的处理只能应用程序来处理。

 

      void ESUTIL_API

esTranslate ( ESMatrix *result, GLfloat tx, GLfloat ty, GLfloat tz )

{

   result->m[3][0] += ( result->m[0][0] * tx + result->m[1][0] * ty + result->m[2][0] * tz );

   result->m[3][1] += ( result->m[0][1] * tx + result->m[1][1] * ty + result->m[2][1] * tz );

   result->m[3][2] += ( result->m[0][2] * tx + result->m[1][2] * ty + result->m[2][2] * tz );

   result->m[3][3] += ( result->m[0][3] * tx + result->m[1][3] * ty + result->m[2][3] * tz );

}

 

void ESUTIL_API

esRotate ( ESMatrix *result, GLfloat angle, GLfloat x, GLfloat y, GLfloat z )

{

   GLfloat sinAngle, cosAngle;

   GLfloat mag = sqrtf ( x * x + y * y + z * z );

 

   sinAngle = sinf ( angle * PI / 180.0f );

   cosAngle = cosf ( angle * PI / 180.0f );

 

   if ( mag > 0.0f )

   {

      GLfloat xx, yy, zz, xy, yz, zx, xs, ys, zs;

      GLfloat oneMinusCos;

      ESMatrix rotMat;

 

      x /= mag;

      y /= mag;

      z /= mag;

 

      xx = x * x;

      yy = y * y;

      zz = z * z;

      xy = x * y;

      yz = y * z;

      zx = z * x;

      xs = x * sinAngle;

      ys = y * sinAngle;

      zs = z * sinAngle;

      oneMinusCos = 1.0f - cosAngle;

 

      rotMat.m[0][0] = ( oneMinusCos * xx ) + cosAngle;

      rotMat.m[0][1] = ( oneMinusCos * xy ) - zs;

      rotMat.m[0][2] = ( oneMinusCos * zx ) + ys;

      rotMat.m[0][3] = 0.0F;

 

      rotMat.m[1][0] = ( oneMinusCos * xy ) + zs;

      rotMat.m[1][1] = ( oneMinusCos * yy ) + cosAngle;

      rotMat.m[1][2] = ( oneMinusCos * yz ) - xs;

      rotMat.m[1][3] = 0.0F;

 

      rotMat.m[2][0] = ( oneMinusCos * zx ) - ys;

      rotMat.m[2][1] = ( oneMinusCos * yz ) + xs;

      rotMat.m[2][2] = ( oneMinusCos * zz ) + cosAngle;

      rotMat.m[2][3] = 0.0F;

 

      rotMat.m[3][0] = 0.0F;

      rotMat.m[3][1] = 0.0F;

      rotMat.m[3][2] = 0.0F;

      rotMat.m[3][3] = 1.0F;

 

      esMatrixMultiply ( result, &rotMat, result );

   }

}

 

 

投影矩阵:

     将眼睛坐标变为裁剪坐标

     void ESUTIL_API

esFrustum ( ESMatrix *result, float left, float right, float bottom, float top, float nearZ, float farZ )

{

   float       deltaX = right - left;

   float       deltaY = top - bottom;

   float       deltaZ = farZ - nearZ;

   ESMatrix    frust;

 

   if ( ( nearZ <= 0.0f ) || ( farZ <= 0.0f ) ||

         ( deltaX <= 0.0f ) || ( deltaY <= 0.0f ) || ( deltaZ <= 0.0f ) )

   {

      return;

   }

 

   frust.m[0][0] = 2.0f * nearZ / deltaX;

   frust.m[0][1] = frust.m[0][2] = frust.m[0][3] = 0.0f;

 

   frust.m[1][1] = 2.0f * nearZ / deltaY;

   frust.m[1][0] = frust.m[1][2] = frust.m[1][3] = 0.0f;

 

   frust.m[2][0] = ( right + left ) / deltaX;

   frust.m[2][1] = ( top + bottom ) / deltaY;

   frust.m[2][2] = - ( nearZ + farZ ) / deltaZ;

   frust.m[2][3] = -1.0f;

 

   frust.m[3][2] = -2.0f * nearZ * farZ / deltaZ;

   frust.m[3][0] = frust.m[3][1] = frust.m[3][3] = 0.0f;

 

   esMatrixMultiply ( result, &frust, result );

}

 

 

void ESUTIL_API

esPerspective ( ESMatrix *result, float fovy, float aspect, float nearZ, float farZ )

{

   GLfloat frustumW, frustumH;

 

   frustumH = tanf ( fovy / 360.0f * PI ) * nearZ;

   frustumW = frustumH * aspect;

 

   esFrustum ( result, -frustumW, frustumW, -frustumH, frustumH, nearZ, farZ );

}

 

aspect =width/height;

fovy:视野角度(0-180)

 

 

计算MVP矩阵------模型-视图矩阵和投影矩阵的乘积。

esMatrixMultiply(&userData->mvpMatrix, &modelview, &projection)

MVP矩阵用glUniformMatrix4fv加载到统一变量中,供着色器使用:

userdata->mvpLoc = glGetUniformLocation(userData->programObject, "u_mvpMatrix");

加载MVP

glUniformMatrix4fx(userData->mvpLoc,1,GL_FALSE,(GLfloat*)&userData->mvpMatrix,m[0][0])

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

opengles3.0 学习,顶点着色器(六) 的相关文章

随机推荐

  • Linux opencv打开摄像头和opencv旋转90和180度

    1 opencv打开摄像头 include
  • Unity与安卓arr简单调用

    前言 简单记录一下 方便后期第三方SDK做参考 一 在AndroidStudio创建空项目 二 创建空模块 复制classes jar至创建新模块的lib中 并加入设置Library classes jar文件来自你当前要使用的arr的Un
  • 深度学习MRI重建综述

    参考文章 A review and experimental evaluation of deep learningmethods for MRI reconstruction 文字有点乱 可以看表格 基于展开的方法 Yang et al
  • C#中对txt文件的读写操作

    C 中对txt文件进行读写操作包括两种方式 一种是基于FileInfo类 调用该类的Read方法 但是该方法读出来的数据是byte格式 需要对其进行解码 将相应的字节数转换为字符 而C 中System Text引用就包含的解码的方法 相应代
  • php消息队列的应用

    欢迎加入 新群号码 99640845 最近打算开发一个新功能 计划应用消息队列 以前对消息队列都是简单的理论了解 真正应用之后把自己的感觉和一些理解整理下来 说正事分割线 具体的业务场景如下 用户下单 生成订单 支付 返回支付信息 就是正常
  • el-tab切换时echarts图表宽度变为100px

    由于el tabs切换的时候 不显示的tab内容默认通过display none 所以导致echarts图表为100px 解决办法 在图表上使用v if来解决
  • c++ 九九乘法表,倒计时,成语接龙等游戏源代码

    include
  • 数据结构之顺序表详解

    目录 前言 1 顺序表 2 顺序表及其功能实现 2 1 准备工作 2 2 顺序表结构的创建 2 3 顺序表的初始化 2 4 顺序表向后插入数据 2 5 打印函数的实现 2 5 顺序表从后删除数据 2 6 顺序表向前插入数据 2 7 顺序表从
  • chrome45以后的版本安装lodop后,仍提示未安装解决

    请先查看你chrome浏览器的版本 如果是45版本以前的版本 安装后仍提示 未安装 或 请升级 请参照本链接解决 http blog sina com cn s blog 721e77e50102vfjl html 以下是chrome版本4
  • 一键部署设计稿至线上 —— D2C国产神器

    微软近期推出了Power Apps 新功能 Express Design 只要上传一个草图或者是 Figma 文件 Express Design 都会在几秒钟之内用 AI 技术将其转化为一个应用程序 不写代码就能生成一个应用 一直以来是我们
  • 服务器上调试程序 pdb命令调试

    以前写python一直用pycharm 调试啥的比较方便 最近要在远程服务器上调试一些程序 只有一个控制台就可以用pdb进行调试了 常用的只有几个命令 break 或 b 设置断点 continue 或 c 继续执行程序 list 或 l
  • 输入一个字符串,判断其是否是回文。(回文:即正读和反读都一样,如abccba, abccba)

    输入一个字符串 判断其是否是回文 回文 即正读和反读都一样 如abccba abccba 这里讨了个巧用了strcmp函数 注 strcmp用法 字符串比较函数 一般形式为strcmp 字符串1 字符串2 比较规则 对两个字符串自左至右逐个
  • linux 系统留后门方法和清除日志

    1 setuid cp bin sh tmp sh chmod u s tmp sh 加上 suid 位到shell上 虽然很简单 但容易被发现 2 echo hack 0 0 bin csh gt gt etc passwd 即给系统增加
  • 剑指 Offer 62. 圆圈中最后剩下的数字(java+python)

    0 1 n 1这n个数字排成一个圆圈 从数字0开始 每次从这个圆圈里删除第m个数字 删除后从下一个数字开始计数 求出这个圆圈里剩下的最后一个数字 例如 0 1 2 3 4这5个数字组成一个圆圈 从数字0开始每次删除第3个数字 则删除的前4个
  • Qt QToolButton和QListWidget的使用

    1 本篇简介 本篇主要演示QListWidget的使用 还涉及工具箱 QToolBox 和工具按钮 QToolButton 的使用 还会通过Action创建工具按钮的下拉菜单和QListWidget的组件的快捷菜单 展示如下图 2 QLis
  • Redis之string类型的三大编码解读

    目录 string类型的三大编码 int 编码 embstr 编码 raw 编码 明明没有超过阈值 为什么变成raw 查看数据类型相关命令 redis看看类型 type key 看看编码 object encoding debug结构 de
  • 2021年wsl2中配置Ubuntu18.04+CUDA+Pytorch深度学习环境完全版

    2021年4月 wsl2 中配置深度学习环境完全版 windows10 RTX3090 wsl2 ubuntu18 04 cuda cudatoolkit11 0 cudnn11 0 gnome anaconda3 pycharm 写在前面
  • 使用tinyproxy简易搭建代理服务器

    需要 腾讯云服务器或阿里云服务器 虚拟机 步骤 第一步 在自己的云服务器上安装 tinyproxy 如果是 Ubuntu 就使用 apt install y tinyproxy 如果是 Centos 则使用 yum install y ti
  • 图像去模糊:MIMO-UNet 模型详解

    本内容主要介绍实现图像去模糊的 MIMO UNet 模型 论文 Rethinking Coarse to Fine Approach in Single Image Deblurring 代码 官方 https github com cho
  • opengles3.0 学习,顶点着色器(六)

    opengles3 0 学习 顶点着色器 六 顶点着色器输入包括 属性 用顶点数组提供的逐顶点数据 统一变量和统一变量缓冲区 顶点着色器使用的不变数据 采样器 代表顶点着色器使用的纹理的特殊统一变量类型 着色器程序 顶点着色器的源码 顶点着