OpenGL和D3D的区别
(1)世界坐标系
OpenGL为右手坐标系 D3D为左手坐标系
(2)向量
OpenGL使用列向量,D3D使用行向量
(3)投影平面
D3D投影平面为z=1.0,OpenGL为z=-1.0;为了便于理解,可将其定义为视景体近裁截面
(4)CVV
OpenGL中z的范围:[-1.0, 1.0] D3D为:[0.0, 1.0]
(5)shader
shader开始是以汇编的形式出现,在推出一段时间后,就出现如下几种类C的高级语言(注:这些高级语言会被编译成显卡识别的汇编代码)
OpenGL的shader语言为GLSL D3D为HLSL
CG是nVidia公司的shader语言 可以同时在OpenGL和D3D上跑
ASHLI(Advanced Shading Language Interface)是ATI公司的shader语言
(6)顶点颜色顺序
OpenGL为:RGBA格式 D3D为:BGRA格式
(7)视口坐标系
OpenGL的原点为左下角像素的中心 x轴向右 y轴向上
D3D9的原点为左上角像素的左上角 D3D10+的原点为左上角像素的中心 x轴向右 y轴向下
-----------------------节选自《跨越opengl和d3d的鸿沟(一):开篇》 -----------------------
初学者经常说,OpenGL用右手坐标系,而D3D用左手;裁剪空间里OpenGL的z是[-1, 1],而D3D是[0, 1];不可调和。
实际上,直接把左手的顶点和矩阵给OpenGL也是没有问题的。毕竟如果在VS里执行的都是mul(v, matrix),得到的会是同样的结果。可能会造成麻烦的反而是viewport的z。
假设一个经过clip之后的顶点坐标为(x, y, z, w),那么在OpenGL上,该顶点经过viewport变换的z是(z/w + 1) / 2,而在D3D上则是z/w而已。
这对于depth test不影响,但depth buffer里的值就不同了。所以需要对project matrix做一些调整,
才能让他们写到depth buffer中的数值相同。具体来说,如果要让OpenGL流水线接受D3D的project matrix,就需要乘上
1 & 0 & 0 & 0
0 & 1 & 0 & 0
0 & 0 & 2 & 0
0 & 0 & -1 & 1
相当于把project space的顶点z都作了z = z * 2 – 1的操作,所以经过viewport变换就一致了。
D3D到OpenGL的矩阵也可以依此类推。所以,在坐标系上,很容易就能使两者接受同样的输入,同时也没有增加runtime开销。
本篇讲的都是可以在不改变API的情况下,通过输入数据来消除OpenGL和D3D之区别。
-----
可参考:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)