GLSL——旋转、平移和缩放

这篇具有很好参考价值的文章主要介绍了GLSL——旋转、平移和缩放。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

hello 兄弟们,好久不见撒,我又回来啦!,今天主要讲解如何在顶点着色器中进行旋转、平移和缩放,涉及到矩阵和向量方面的知识哦,忘记的可以翻一下高中数学啦,在讲之前,先回顾一下矩阵和向量点积的知识,矩阵点乘向量,等于矩阵的每一行分别和向量相乘的和,如图1所示,单位矩阵和向量(x,y,z,w)的点乘:

glsl是图元旋转绕y轴,shader,glsl,OpenGL,矩阵,着色器,c++

图1

 一、旋转

图2所示,x轴上一点,绕z轴先转α角度后到B点的位置,求B点的坐标:

glsl是图元旋转绕y轴,shader,glsl,OpenGL,矩阵,着色器,c++

图2

 利用和角公式可得B点的坐标:

                        f(x) = x*cos(α) - y*sin(α);

                        f(y) = x*sin(α) + y*cos(α);

结合图1的矩阵,若要f(x) = x*cos(α) - y*sin(α),则矩阵的第一行元素为(cos(α), -sin(α), 0, 0),若要f(y) = x*sin(α) + y*cos(α),则矩阵的第二行元素为(sin(α), cos(α), 0, 0),所以矩阵为图3所示,因为我们计算矩阵用的是行主序,而shader中用的是列主序,需要将行主序转换成列主序:

glsl是图元旋转绕y轴,shader,glsl,OpenGL,矩阵,着色器,c++glsl是图元旋转绕y轴,shader,glsl,OpenGL,矩阵,着色器,c++

                                                     图3

了解了原理后,就可以在shader中进行旋转了。我画了一个正方形(具体画法看我前几篇文章,这里不做介绍,直接在顶点shader里进行旋转),让正方形旋转30°,代码如下:

attribute vec3 kzPosition;
uniform highp mat4 kzProjectionCameraWorldMatrix;
void main()
{
    precision mediump float;
    //度数转为弧度制
    float angle = radians(30.);

    //旋转矩阵
    mat4 m4 = mat4(
    cos(angle), sin(angle), 0.0, 0.0,
    -sin(angle), cos(angle), 0.0, 0.0,
    0.0,        0.0,         1.0, 0.0,
    0.0,        0.0,         0.0, 1.0
    );
    
    vec4 pos = m4 * vec4(kzPosition, 1.0);
    gl_Position = kzProjectionCameraWorldMatrix * pos;
}

 效果图如图4所示:

glsl是图元旋转绕y轴,shader,glsl,OpenGL,矩阵,着色器,c++

图4

 二、平移

让图形沿x轴平移100,沿y平移200,也就是让图1中的x为x+100,让y为y+200,那么和什么矩阵点乘会得到想要的结果呢?我们可以看到,图1的矩阵出了(x,y,z),还有个w的元素,这个w也就是矩阵的齐次坐标(自行补习知识,这里不做赘述),我们可以通过w来改变图形的位移,得到的平移矩阵如图5所示:(记得在shader中使用的是列主席哦)

glsl是图元旋转绕y轴,shader,glsl,OpenGL,矩阵,着色器,c++

 平移代码:

attribute vec3 kzPosition;
uniform highp mat4 kzProjectionCameraWorldMatrix;
void main()
{
    precision mediump float;
    float tx = 100.;
    float ty = 200.;
    float tz = 0.;
    //x,y移动100,200
    mat4 m = mat4(
        1.0, 0.0, 0.0, 0.0,
        0.0, 1.0, 0.0, 0.0,
        0.0, 0.0, 1.0, 0.0,
        tx,  ty,  tz,  1.0
    );
    
    vec4 pos = m * vec4(kzPosition, 1.);
    gl_Position = kzProjectionCameraWorldMatrix * pos;
}

 三、缩放

如果使图片的x和y各缩放0.5倍,那么图1中的x应该为0.5x,y应为0.5y,即矩阵的第一行的结果为0.5x,第二行为0.5y,则矩阵第一行的x的元素就应该是0.5,第二行的y元素也应该是0.5,得到的矩阵如图6:

glsl是图元旋转绕y轴,shader,glsl,OpenGL,矩阵,着色器,c++

代码:

attribute vec3 kzPosition;
uniform highp mat4 kzProjectionCameraWorldMatrix;
void main()
{
    precision mediump float;
    float sx = 0.5;
    float sy = 0.5;
    float sz = 1.;
    mat4 m = mat4(
        sx,  0.0, 0.0, 0.0,
        0.0, sy,  0.0, 0.0,
        0.0, 0.0, sz, 0.0,
        0.0, 0.0, 0.0, 1.0
    );
    
    vec4 pos = vec4(kzPosition, 1.) * m;
    gl_Position = kzProjectionCameraWorldMatrix * pos;
}

 效果图如图7所示:(相较于图4,缩小了0.5倍)

glsl是图元旋转绕y轴,shader,glsl,OpenGL,矩阵,着色器,c++

图7文章来源地址https://www.toymoban.com/news/detail-596821.html

到了这里,关于GLSL——旋转、平移和缩放的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Halcon用矩阵实现图像变换(平移,旋转,缩放,镜像等)

    目录 图像变换介绍  用Halcon自带的算子实现图像变换 使用矩阵来实现相关算子的功能 一、平移 二、旋转 三、缩放 四、镜像 完整代码         在halcon中经常会用到图像变换的操作,然后这次作业是用矩阵来实现相关算子的功能,学到了挺多的所以就记录下来方便复习。

    2024年04月17日
    浏览(40)
  • 第三章 OpenGL ES 基础-基础-GLSL渲染纹理

    第一章 OpenGL ES 基础-屏幕、纹理、顶点坐标 第二章 OpenGL ES 基础-GLSL语法简单总结 第三章 OpenGL ES 基础-GLSL渲染纹理 第四章 OpenGL ES 基础-位移、缩放、旋转原理 第五章 OpenGL ES 基础-透视投影矩阵与正交投影矩阵 第六章 OpenGL ES 基础-FBO、VBO理解与运用 第七章 OpenGL ES 基础-输入

    2024年03月18日
    浏览(47)
  • QGraphicsView制作绘制图元工具资料整理(鼠标、平移、缩放)

    QGraphicsView制作绘制工具资料整理 继承自QGraphicsView的类中使用QGraphicsSceneMouseEvent 简单显示图片的示例 Qt之QGraphicsView入门篇 Qt之QGraphicsView入门篇 鼠标事件和滚轮事件 鼠标事件和滚轮事件 QGraphicsItem的缩放 QGraphicsItem的缩放 QT官方文档:QGraphicsItem Class QGraphicsItem Class Qt之QGraph

    2024年02月09日
    浏览(37)
  • OPENGL ES 2.0 知识串讲 (6)——GLSL 语法(IV)

    上面两节,主要讲解了 GLSL 中变量和函数的定义语法和使用语法,现在我们可以在 shader 中自定义一些我们所需要用到的变量和函数。但是在 shader 中, 还存在着一些内置的变量和函数。这些变量主要是用于将 Shader 计算得到的值传给 GPU,完成 Shader 在 Pipeline 中的功能。由于我们使

    2024年02月02日
    浏览(80)
  • 2D坐标系下的点的转换矩阵(平移、缩放、旋转、错切)

    1. 平移 (Translation) 在2D空间中,我们经常需要将一个点平移到另一个位置。假设空间中的一点 P ( x , y ) P(x,y) P ( x , y ) ;将其向 x , y x, y x , y 方向分别平移 t x t_x t x ​ , t y t_y t y ​ , 假设平移后点的坐标为 ( x ′ , y ′ ) (x\\\',y\\\') ( x ′ , y ′ ) ,则上述点的平移操作可以归纳为

    2024年02月15日
    浏览(37)
  • Unity矩阵平移旋转缩放Matrix4x4

    最近在研究帧同步定点数物理系统中需要自定义定点数矩阵,所以在这里分享下基础的矩阵案例旋转、平移、缩放。(注意这里本文中的transform组件式基于unity浮点数的教程并非帧同步定点数)参考原文 参数可以参考我上图的参数,这里注意三个顶点是一个面,这里我上述的

    2024年01月17日
    浏览(38)
  • 【Webgl_glsl&Threejs】搬运分享shader_飘落心形

    将shadertory上的代码转成了threejs可以直接用的代码,引入文件的material,并在创建mesh或已有物体上使用material即可,使用时请注意uv对齐。 flowHeart

    2024年04月27日
    浏览(30)
  • Android中矩阵Matrix实现平移,旋转,缩放和翻转的用法详细介绍

    一,矩阵Matrix的数学原理 矩阵的数学原理涉及到矩阵的运算和变换,是高等代数学中的重要概念。在图形变换中,矩阵起到关键作用,通过矩阵的变换可以改变图形的位置、形状和大小。矩阵的运算是数值分析领域的重要问题,对矩阵进行分解和简化可以简化计算过程。对于

    2024年01月22日
    浏览(53)
  • 三维变换矩阵实战——三维点云的旋转、缩放、镜像、错切、平移、正交投影

    旋转矩阵:右边矩阵是点云的原始坐标,左边的是旋转矩阵     可视化:绕x轴旋转90度 代码: 旋转矩阵:    可视化:绕y轴旋转180度 代码: 旋转矩阵:    可视化:绕z轴旋转90度 代码: 旋转矩阵:  线绕哪个轴转,xyz矩阵就和哪和轴的旋转矩阵先计算      可视化:先

    2024年02月04日
    浏览(88)
  • Unity记录一些glsl和hlsl的着色器Shader逆向代码

    以下内容一般基于 GLSL 300 之后 以下某些代码行,是“伪代码“,绝大部分是renderDoc 逆向产生标准代码 本人OpenlGL零基础,也不打算重头学 目录 Clip() 剔除函数 discard; FS最终颜色输出 out 和最终颜色相加方程 从 discard; 命令可得知,一般通过透明度剔除, _26 == color.a _21.w 刚

    2024年02月07日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包