NDC空间(归一化的设备坐标空间)整理记录

2023-11-09 16:59

本文主要是介绍NDC空间(归一化的设备坐标空间)整理记录,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

- 在齐次裁剪空间的基础上进行透视除法(perspective division)或称齐次除法(homogeneous division),得到的坐标叫做NDC空间坐标。

补充渲染流水线:

模型数据-顶点着色 - 曲面细分 - 几何着色器 - 裁剪 - NDC空间 - 屏幕空间 - 光栅阶段 - 帧缓存

其中曲面细分和几何着色器是可选项,而从裁剪空间---NDC空间---屏幕空间一般由底层帮我们自动完成。我们的顶点着色器只需要把顶点转换到齐次裁剪空间就可(就是一般所说的输出的positionCS)空间。

透视除法:就是将齐次裁剪空间坐标positionCS的X,Y,Z分量都除以W分量。

我们假设在NDC空间中,经过透视除法后的点为:

,那么x’,y’,z’的取值范围则在【-1,1】区间内。反推会齐次裁剪空间的公式:

NDC空间到屏幕空间:顶点着色器我们的输出在齐次裁剪,那么片段着色器的输入是什么呢?不是齐次裁剪空间,也不是NDC空间,而是屏幕空间。

在Unity中屏幕左下角像素坐标为(0,0),右上角像素坐标为(pixelWidth,pixelHeight),由于当前x,y的坐标范围为【-1,1】,因此是一个缩放的过程,可以用下面公式变换:

ScreenX = NDCx * pixelWidth/2 + pixelWidth/2;

ScreenY = NDCy * pixelWidth/2 + pixelWidth/2;

ScreenZ的值通常为Clipz/Clipw,存入深度缓冲,但也不是必须。

注意上面所说的屏幕空间和使用unity内置函数o.screenPos = ComputeScreenPos(o.vertex)不同,内置函数直接从齐次裁剪空间转换,没有经过透视除法转换到NDC空间的过程,所以如果使用内置函数,需要自己在片段着色器中不上透视除法。

如果需要从屏幕空间转换到NDC空间,可以使用内置函数ComputeScreenPos(o.vertex),求得ScreenPos后进行下面公式转换:

float4 ndcPos = (o.screenPos / o.screenPos.w) * 2 - 1;

这篇关于NDC空间(归一化的设备坐标空间)整理记录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/377405

相关文章

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

统一返回JsonResult踩坑的记录

《统一返回JsonResult踩坑的记录》:本文主要介绍统一返回JsonResult踩坑的记录,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录统一返回jsonResult踩坑定义了一个统一返回类在使用时,JsonResult没有get/set方法时响应总结统一返回

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

MySQL复杂SQL之多表联查/子查询详细介绍(最新整理)

《MySQL复杂SQL之多表联查/子查询详细介绍(最新整理)》掌握多表联查(INNERJOIN,LEFTJOIN,RIGHTJOIN,FULLJOIN)和子查询(标量、列、行、表子查询、相关/非相关、... 目录第一部分:多表联查 (JOIN Operations)1. 连接的类型 (JOIN Types)

java对接海康摄像头的完整步骤记录

《java对接海康摄像头的完整步骤记录》在Java中调用海康威视摄像头通常需要使用海康威视提供的SDK,下面这篇文章主要给大家介绍了关于java对接海康摄像头的完整步骤,文中通过代码介绍的非常详细,需... 目录一、开发环境准备二、实现Java调用设备接口(一)加载动态链接库(二)结构体、接口重定义1.类型

MySQL启动报错:InnoDB表空间丢失问题及解决方法

《MySQL启动报错:InnoDB表空间丢失问题及解决方法》在启动MySQL时,遇到了InnoDB:Tablespace5975wasnotfound,该错误表明MySQL在启动过程中无法找到指定的s... 目录mysql 启动报错:InnoDB 表空间丢失问题及解决方法错误分析解决方案1. 启用 inno

apache的commons-pool2原理与使用实践记录

《apache的commons-pool2原理与使用实践记录》ApacheCommonsPool2是一个高效的对象池化框架,通过复用昂贵资源(如数据库连接、线程、网络连接)优化系统性能,这篇文章主... 目录一、核心原理与组件二、使用步骤详解(以数据库连接池为例)三、高级配置与优化四、典型应用场景五、注意事

SpringBoot实现文件记录日志及日志文件自动归档和压缩

《SpringBoot实现文件记录日志及日志文件自动归档和压缩》Logback是Java日志框架,通过Logger收集日志并经Appender输出至控制台、文件等,SpringBoot配置logbac... 目录1、什么是Logback2、SpringBoot实现文件记录日志,日志文件自动归档和压缩2.1、

在Java中基于Geotools对PostGIS数据库的空间查询实践教程

《在Java中基于Geotools对PostGIS数据库的空间查询实践教程》本文将深入探讨这一实践,从连接配置到复杂空间查询操作,包括点查询、区域范围查询以及空间关系判断等,全方位展示如何在Java环... 目录前言一、相关技术背景介绍1、评价对象AOI2、数据处理流程二、对AOI空间范围查询实践1、空间查

qtcreater配置opencv遇到的坑及实践记录

《qtcreater配置opencv遇到的坑及实践记录》我配置opencv不管是按照网上的教程还是deepseek发现都有些问题,下面是我的配置方法以及实践成功的心得,感兴趣的朋友跟随小编一起看看吧... 目录电脑环境下载环境变量配置qmake加入外部库测试配置我配置opencv不管是按照网上的教程还是de