码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • OpenGL坐标系转换


    转换过程

    在opengl中,一个坐标的完整转换过程,从结构层、渲染管线、坐标空间三个层级的划分如下:
    结构层:顶点——>图元——> 片元——>缓冲(FBO)
    图像渲染管线:顶点着色器 ——>图元装配——>裁剪 ——>几何着色器
    ——>栅格化 ——>片段着色器——> 测试与混合
    坐标空间:Model/Local —
    (ModelTransform)
    —> World —(ViewTransform)—> eye/view/camera —(视椎体裁剪,椎体范围转为正方体范围)—>Clip ———(PerspectiveDivide)—>NDC(clip/w)——(ViewportTransform)——>Screen——(ScanConversion)——>Window**

    顶点的三个状态
    顶点(vertex), 一些点
    图元(primitives), 顶点组合成图元。根据渲染模式(点、线、面)对三角面进行细分,复杂结构增加物体的三角面数以拆解成基本图元。
    片元 (Fragment),表示基本图元映射到二维平面上的映射区域,通常一个Fragment对应屏幕一个像素。
    栅格化是把点线三角形映射到屏幕上的像素点的过程。

    图像渲染管线各过程详解

    • 顶点着色器:MVP变换,光照计算。与顶点相关的全部属性完全确定。输出camera space下的顶点。
    • 图元装配:顶点数据被结合成完整图元。输出图元。
    • 几何着色器:输入图元,对三角面进行细分,产生一些新顶点,构造一些新图元。
    • 裁剪:(只有图元才能裁剪,顶点没有几何意义。不裁剪,视线范围无限远)用相机视椎体裁剪世界坐标 ,视椎体视线范围转为正方体视线范围。输出Clip space 图元。
    • 透视除法:四维齐次坐标通过透视除法转换为三维NDC。NDC的意义在于顶点最后要输出到屏幕空间。
    • 视口变换, 三维坐标转为二维像素坐标。输出Screen space 图元。
    • 剔除:背面剔除
    • 光栅化:将图元的几何定义转为图像空间的离散点,生成片元集合。输出Screen space。
    • 片元着色器:
    • 测试与混合
      • 深度剔除
      • 遮挡剔除
      • 透明物体融合
    坐标系转换过程

    w分量
    左右手坐标系转换?
    ![](https://img-blog.csdnimg.cn/img_convert/8a612cc69330963eff4ccb221034aa4b.webp?x-oss-process=image/format,png#clientId=u698db15f-1df0-4&crop=0&crop=0&crop=1&crop=1&from=paste&id=ucc0162e6&margin=[object Object]&originHeight=1046&originWidth=600&originalType=url&ratio=1&rotation=0&showTitle=false&status=done&style=none&taskId=u2d346de2-eaae-441c-90eb-fb0640ba54c&title
    Eye坐标系如何转成NDC坐标系?
    在这里插入图片描述

    1. 非齐次坐标(x,y,z,1)转为齐次坐标(xe,ye,ze,w);
    2. Eye Space的点e 映射到 视椎体Near平面 的点p,再映射到 NDC空间 点ndc,到此,视线范围确定为xh,yh,zh ∈[-w,w]
    3. 透视除法后,得到真正的NDC坐标系。 ndc.xyz = clip.xyz / clip.w;

    第二步详细过程:
    1.Eye Space的点e在两个二维平面 (ZX平面 ZY平面)上映射到视椎体Near平面 的点p,得到点e和点p的映射关系。
    2.视椎体Near平面映射到NDC空间的[-1,1], 求出 点ndc和点p的关系
    最后得到点e和点ndc的关系,
    三维NDC坐标系转为二维像素坐标系
    最终,模型要显示在二维平面上,其范围与视口相关。NDC空间很接近窗口,NDC的xy坐标与窗口坐标之间的线性关系被称为视口变换。NDC的z值理解为深度值。

    参考文档
    gl_FragColor的含义
    从顶点到片元
    OpenGL投影矩阵(Projection Matrix)构造方法 - lxycg - 博客园

    游戏开发技术杂谈3:OpenGL投影矩阵

  • 相关阅读:
    深入了解Vue.js框架:构建现代化的用户界面
    当try_files遇上gateway是如何产生火花的
    TCP协议和UDP协议
    使用 Qt for Android 获取并利用手机传感器数据(1)开发环境省心搭建
    删除Windows网络连接的网络编号,网络号,有线网卡的网络1,网络2....,快速批量删除每次增加的网络序号
    基于Java咖啡商品管理系统设计实现(源码+lw+部署文档+讲解等)
    在Android中实现来自Material设计的Ripple效果:RippleEffect
    win中的vscode利用ssh插件,在同一台电脑的virtualbox虚拟出来的ubuntu中编译,调试设置方法
    CentOS上如何配置手动和定时任务自动进行时间同步
    MySql on duplicate key update
  • 原文地址:https://blog.csdn.net/hhhhhhenrik/article/details/127688280
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号