精华内容
下载资源
问答
  • OPENGL屏幕坐标系原点在左下角向上向右增加,D3D屏幕坐标系原点在左上角向下向右增加。 所以glViewPort的从设备坐标系变换到屏幕空间的变换公式为: 使得(-1,-1)到左下角(x0,y0), (1,1)到右上角(x0 + w, y0 ...
    OPENGL屏幕坐标系原点在左下角向上向右增加,D3D屏幕坐标系原点在左上角向下向右增加。
    所以glViewPort的从设备坐标系变换到屏幕空间的变换公式为:

    使得(-1,-1)到左下角(x0,y0), (1,1)到右上角(x0 + w, y0 + h)。

    D3D中设备坐标系变换到屏幕的公式为:
    Xw = x* w/2 + w / 2 + x0;
    Yw = -y * h/2 + h / 2 + y0;
    使得(-1,1)到左上角(x0,y0), (1,-1)到右下角(x0 + w, y0 + h)。

    还需要注意OPENGL中像素的位置在格子中心,D3D9在格子左上角因此偏移0.5个像素,D3D10在格子中心。

    拓展OPENGL和D3D区别联系见: http://blog.chinaunix.net/uid-20235103-id-3060257.html
    1.世界坐标系不同,视图坐标系和投影坐标系不同导致三角网格顶点数据不同,法向量需要调整,还有叉积和旋转变换不同,绘制正面不同。矩阵表示不同,OGL是用列式矩阵,和列式向量,所以要矩阵右乘向量得到变换结果。

    2.屏幕坐标系不同和像素中心不同

        提到了坐标系的区别,另一个类似的区别出现在窗口朝向上。D3D用了左上角作为原点,而OpenGL用了左下角。D3D9用了像素左上角作为原点,而OpenGL和D3D10+用了像素中心。在像素和纹理需要1:1对应的时候,该问题就需要严重关注了。详见Directly Mapping Texels to Pixels

    窗口原点的不同造成的结果就是,两个API做render to texture之后,产生的texture在y方向是相反的。这本身可以通过调整project matrix来调整。简而言之,就是:

    glMatrixLoadIdentityEXT(GL_PROJECTION);
    glMatrixScalefEXT(GL_PROJECTION, 1, -1, 0); // y方向取反
    glMatrixTranslatefEXT(GL_PROJECTION,  0.5f / win_width, 0.5f / win_height, 0); // 调整到D3D9的话还需要偏移0.5个像素

    因此,OpenGL提供了GL_ARB_fragment_coord_conventions这个扩展,专门用来指定像素坐标的原点和偏移。在GLSL的声明里添加个属性:

    // OpenGL原生的方式
    in vec4 gl_FragCoord;

    // D3D9的方式
    layout(origin_upper_left, pixel_center_integer) in vec4 gl_FragCoord;

    // D3D10+的方式
    layout(origin_upper_left) in vec4 gl_FragCoord;

    这样就可以把像素坐标调整过来。

    综上所述,通过现代OpenGL核心和扩展的支持,填平了一些原本被认为位于底层的区别,同时不会有性能损失。破解了上篇提到的流言3。下篇将剖析两个API的功能异同,以及直接相互访问的可能性。


     3.Z缓存值大小不同

        初学者经常 说,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,就需要乘上

    为什么是这样,其实不用关注的?

    相当于把project space的顶点z都作了z = z * 2 – 1的操作,所以经过viewport变换就一致了。D3D到OpenGL的矩阵也可以依此类推。所以,在坐标系上,很容易就能使两者接受同样的输入,同时也没有增加runtime开销。



    4.颜色值格式不同

    D3D9 最常用的顶点颜色格式是BGRA格式(也就是D3DCOLOR),而OpenGL默认用的是RGBA格式。D3D9用BGRA纯粹是因为历史原因,早期硬 件不支持UBYTE4的格式,只能用D3DCOLOR,然后再shader里调用D3DCOLORtoUBYTE4。现在的GPU都支持 UBYTE4,D3D10+也是可以直接使用RGBA,所以这已经不是问题了。

    如果需要兼容已经生成BGRA格式数据,现代OpenGL提供了GL_EXT_vertex_array_bgra这个扩展,也可以使用BGRA作为顶点颜色输入格式:

    glColorPointer(GL_BGRA, GL_UNSIGNED_BYTE, stride, pointer);
    glSecondaryColorPointer(GL_BGRA, GL_UNSIGNED_BYTE, stride, pointer);
    glVertexAttribPointer(GL_BGRA, GL_UNSIGNED_BYTE, stride, pointer);

    该扩展进入了OpenGL 3.2的核心。


    5.D3D11的一些高级特性还只是软件层面的,而且OPENGL也可以实现

    State对象

    D3D 10新增了State对象,可以极大地减少由于改变渲染状态所需的系统调用次数。OpenGL中目前还没有State对象,所以只能在上层自行封装。虽然 有些 性能损失,但接口可以和D3D统一起来。ARB针对OpenGL的State对象进行过旷日持久的讨论,还最终各大厂商没有达成一致。不过这是个趋势,相 信不久的将来就会出个相关的扩展。到时候这个区别就能被完美地填平。

    Compute Shader

    D3D 11引入了compute shader,在D3D中直接提供了GPGPU的能力。OpenGL没有因此增加一种shader,而是增强和同门师弟OpenCL的互操作能力。 OpenGL和OpenCL能直接共享texture和buffer等,起到了和compute shader等价的功能。与GLSL和HLSL的关系一样,这里存在着shader语言不同的问题,而且没有Cg可以作为桥梁,目前只能写两份代码。

    Multithreading

    D3D 11的multithreading能力允许多个context都调用D3D11 API,每个context保存下来的API调用流可以在主context执行依次执行。OpenGL目前也没有引入该机制,需要在上层自行实现。话说回 来了,目前的所有显卡 驱动都没有实现multithreading,所以所有多context都是由D3D runtime软件实现的,没有达到应有的提速效果。自己实现一个command list也能达到那样的性能。仍然希望某一天multithreading能成为OpenGL的功能 之一,简化上层的工作。

    总结

    所以说,OpenGL和D3D功能的交集几乎就是它们的并集,并不会因为需要兼容两者而失去很多功能。从功能上说,OpenGL和D3D之间的分歧甚至小于OpenGL和OpenGL ES。破解了第一篇说的流言4。

    6.Shader部分,cg可以编译大部分着色器代码为GLSL和HLSL.


    展开全文
  • 各轴之间的顺序要求符合右手法则,即以右手握住Z轴,让右手的四指从X轴的正向以90度的直角转向Y轴的正向,这时大拇指所指的方向就是...OPENGL屏幕坐标系原点在左下角向上向右增加,D3D屏幕坐标系原点在左上角向下向右增...

    各轴之间的顺序要求符合右手法则,即以右手握住Z轴,让右手的四指从X轴的正向以90度的直角转向Y轴的正向,这时大拇指所指的方向就是Z轴的正向.这样的三个坐标轴构成的坐标系称为右手空间直角坐标系.与之相对应的是左手空间直角坐标系。

    1.OPENGL设备坐标系(dns)是左手坐标系,屏幕坐标系原点在左下角向上向右增加
    OPENGL屏幕坐标系原点在左下角向上向右增加,D3D屏幕坐标系原点在左上角向下向右增加。
    2.OpenGL 默认的坐标原点是屏幕的正中心
    3.OPENGL坐标系可分为:世界坐标系和当前绘图坐标系。

    世界坐标系以屏幕中心为原点(0, 0, 0)。你面对屏幕,你的右边是x正轴,上面是y正轴,屏幕指向你的为z正轴。长度单位这样来定: 窗口范围按此单位恰好是(-1,-1)到(1,1)。

    当前绘图坐标系是 绘制物体时的坐标系。程序刚初始化时,世界坐标系和当前绘图坐标系是重合的。当用glTranslatef(),glScalef(), glRotatef()对当前绘图坐标系进行平移、伸缩、旋转变换之后, 世界坐标系和当前绘图坐标系不再重合。改变以后,再用glVertex3f()等绘图函数绘图时,都是在当前绘图坐标系进行绘图,所有的函数参数也都是相 对当前绘图坐标系来讲的。
    4.OpenGL默认屏幕坐标系原点在哪?屏幕左下角还是屏幕几何中心处?
    这个能设置吗?
    如果你用的是透视投影的话默认的应该是在屏幕的中心位置,如果用的是平行投影的话则要看你的glOrtho里面设置的参数了,如果是类似于 glOrtho(-320,320,-240,240,1,100)的话中心也在屏幕中心,这是你glVertex2d(0,0)就在中心,但如果 glOrtho(0,320,0,240,1,100)的话glVertex2d(0,0)就不在屏幕中心了,你可以试一试,当然glViewPort的设置也很重要,利用这个可以多视口显示。

    OpenGL:正投影和透视投影

    正投影
    正射投影,又叫平行投影。这种投影的视景体是一个矩形的平行管道,也就是一个长方体,如图所示。正射投影的最大一个特点是无论物体距离相机多远,投影后的物体大小尺寸不变。这种投影通常用在建筑蓝图绘制和计算机辅助设计等平面图形方面,这些行业要求投影后的物体尺寸及相互间的角度不变,以便施工或制造时物体比例大小正确。

    GLFrustum::SetOrthographic(GLfloat xMin,GLfloat xMax,GLfloat yMin,GLfloat yMax,GLfloat zMin,GLfloat zMax);

    2.透视投影
    透视投影符合人们心理习惯,即离视点近的物体大,离视点远的物体小,远到极点即为消失,成为灭点。它的视景体类似于一个顶部和底部都被切除掉的棱椎,也就是棱台。这个投影通常用于动画、视觉仿真以及其它许多具有真实性反映的方面

    GLFrustum::SetPerspective(float fFov,float fAspect,float fNear,float fFar);
    来源https://www.jianshu.com/p/38c3d0d19993)

    以上整理自网络

    展开全文
  • 计算机屏幕坐标系和笛卡尔坐标系的差别是计算机屏幕坐标系的Y轴向下为正,且屏幕坐标都为正值,坐标原点在屏幕的左上角。在计算机地图制图中经常要把一特定区域在计算机屏幕上显示,这就要求首先把...

    大比例尺数字测图中的测量坐标系采用高斯-吕克格坐标系或者是独立坐标系,它们都是一种平面直角坐标系统,和数学中的笛卡尔坐标系基本相同,只是高斯-吕克格坐标系是以X轴为纵轴,用它表示南北方向,Y轴作为横轴,表示东南方向。计算机屏幕坐标系和笛卡尔坐标系的差别是计算机屏幕坐标系的Y轴向下为正,且屏幕坐标都为正值,坐标原点在屏幕的左上角。在计算机地图制图中经常要把一特定区域在计算机屏幕上显示,这就要求首先把实地的测量坐标转换到计算机屏幕坐标系中去,对实地某点P转换到计算机屏幕坐标系中的坐标可按(4-1-1)式计算。

    a4c26d1e5885305701be709a3d33442f.png

    测量坐标系到绘图仪坐标系的换算

    绘图仪坐标系和数学中的笛卡尔坐标系是相同的,它的坐标原点,对不同的绘图仪硬件缺省值不尽相同,有的位于绘图仪的左下角,有的位于绘图仪的中心,但一般都可通过软件将绘图仪的坐标原点设于绘图仪有效绘图区的任一位置。绘图仪的坐标单位为绘图仪脉冲当量,多数绘图仪的一个脉冲当量等于0.025mm或0.00098英寸。

    同样,对实地某点P转换到绘图仪坐标系中的坐标可按(4-1-2)式计算。 其中,(Xg,Yg )、(minXg,minYg

    )的意义同前所述,(Xp,Yp )为点P在绘图仪坐标系中的坐标,(minXp ,minYp )为绘图左下角在绘图仪上的定位坐标,

    M为测量坐标到绘图仪坐标换算的比例系数,即地图比例分母。

    a4c26d1e5885305701be709a3d33442f.png

    其中,(Xg,,Yg

    )为点P在测量坐标系中的坐标,(minXg,,minYg )为要显示区域的最小测量坐标(左下角,如下图), (maxXg,maxYg

    )为最大测量坐(右上角,如下图)。(Xs,Ys )为点P在计算机屏幕显示区的屏幕坐标,(minXs ,minYs

    )为屏幕显示区的最小屏幕坐标(左上角), (maxXs ,maxYs )为屏幕显示区的最大屏幕坐标(右下角,如下图),

    SX,SY为测量坐标到屏幕坐标换算的比例系数,可按下式计算:

    a4c26d1e5885305701be709a3d33442f.png

    为了使得在计算机屏幕上显示的图形不至变形,由测量坐标到屏幕坐标换算的比例系统在X方向和Y方向应采用相同的比例系数SXY,它应该取由(4-1-1a)式计算出的两个系数中的较小者,即SXY=min[SX,SY]。因而,在实际坐标变换中,(4-1-1)式中的SX,SY应都用SXY代替。

    a4c26d1e5885305701be709a3d33442f.png

    展开全文
  • Unity中的坐标系世界坐标系本地坐标系屏幕坐标系视口坐标系各个坐标系相互转换的API 世界坐标系 原点:世界的中心 轴向:世界坐标系的三个轴向是固定的 相关API: transform.position; transform.rotation; 四元数 ...

    世界坐标系

    原点:世界的中心
    轴向:世界坐标系的三个轴向是固定的
    相关API:

    • transform.position;
    • transform.rotation; 四元数
    • transform.eulerAngles; 欧拉角
    • transform.lossyScale;


      移动根据世界坐标系移动 在这里插入图片描述

    本地坐标系

    原点:物体的中心点(建模时决定,一般都是物体的中心点)
    轴向
    物体方为X方向
    物体方为Y方向
    物体方为Z方向
    相关API:

    • transform.localPosition;
    • transform.localRotation; 本地四元数
    • transform.localEulerAngles; 本地欧拉角
    • transform.localScale;

    物体移动根据自己的父物体决定

    在这里插入图片描述


    屏幕坐标系

    原点:屏幕的左下角
    轴向
    X方向
    Y方向
    相关API:
    原点:(0,0)
    右上角:(Screen.width,Screen.height)


    屏幕坐标系图示:
    在这里插入图片描述


    视口坐标系

    摄像机的视口范围

    原点:屏幕左下角
    轴向
    X方向
    Y方向
    相关API
    左下角(0,0)
    右上角(1,1) 归一化


    摄像机组件下的Viewport Rect
    X:水平方向的偏移    Y:竖直方向的偏移
    W:X轴方向的大小    H:Y轴方向的大小 取值范围0~1
    在这里插入图片描述


    各个坐标系相互转换的API

    • 世界转本地
      transform.InverseTransformDirection();
      transform.InverseTransformPoint();
      transform.TransformVector();

    • 本地转世界
      transform.TransformDirection();
      transform.TransformPoint();
      transform.TransformVector();

    • 世界转屏幕
      Camera.main.WorldToScreenPoint();

    • 屏幕转世界
      Camera.main.ScreenToWorldPoint();

    • 世界转视口
      Camera.main.WorldToViewportPoint();

    • 视口转世界
      Camera.main.ViewportToWorldPoint();

    • 视口转屏幕
      Camera.main.ViewportToScreenPoint();

    • 屏幕转视口
      Camera.main.ScreenToViewportPoint();


    如有错误欢迎指正!

    展开全文
  • cocos2d-x的坐标系很重要,想要学好该引擎,深入理解它的坐标体系很重要。... //屏幕坐标系是以左上角为原点,是我们熟悉的 //本地坐标系也叫节点坐标系,世界坐标系是相对于整体而言的,而本地坐标系是相
  • 屏幕坐标系,世界坐标系

    千次阅读 2013-03-26 10:08:25
    屏幕坐标系,主要有两种, 第一种:以左上角为原点。代表的操作系统有Windows,Android,Symbian,iOS 的Core Graphics如图1左侧。 第二种:以左下角为原点。比如iOS的CGContextDrawImage,如图2右侧。 (图2...
  • 屏幕坐标系和视口坐标系

    万次阅读 2018-05-18 08:44:52
    屏幕坐标系1.屏幕坐标系: 手机屏幕或者电脑屏幕的一个坐标系。2.屏幕坐标是以像素来定义的, 屏幕左下角为原点(0,0), 右上角为(Screen.width,Screen.height), width是屏幕的宽度, height是屏幕的高度, Z值是摄像机...
  • Windows坐标系分为逻辑坐标系和设备坐标系两种,GDI支持这两种坐标系。一般而言,GDI的文本和图形输出函数使用逻辑坐标,而在客户区移动或按下鼠标的鼠标位置是采用设备坐标。 <1>逻辑坐标系(Logical ...
  • 屏幕坐标系 屏幕坐标系,主要有两种, 第一种:以左上角为原点。代表的操作系统有Windows,Android,Symbian,iOS 的Core Graphics如图1左侧。 第二种:以左下角为原点。比如iOS的CGContextDrawImage,如图2右侧。 ...
  • 屏幕坐标系转为笛卡尔坐标系

    千次阅读 2019-05-27 10:52:29
    屏幕坐标系为以顶点为坐标向下 笛卡尔坐标原点为(a,b); 输入坐标(x,y) 则转换为笛卡尔坐标为(a+x,b-y)
  • canvas坐标系转为webgl坐标系,webgl的坐标是x[-1, 1],y[-1, 1]。 ①获取canvas在浏览器客户区...图中canvas原点屏幕坐标系下的坐标值为(a,b),即canvas在屏幕上左上角的位置坐标; 其中(a,b)坐标中: a = rect..
  • 不多说,看注释。 bool HelloWorld::init() { bool bRet = false; do { CC_BREAK_IF(! CCLayer::init());... //opengl的坐标系和世界坐标系相同,都是以屏幕左下角为原点,向右为x轴的增加... //屏幕坐标系是以左
  • 计算机屏幕坐标系

    千次阅读 2016-01-05 18:15:44
    常用的屏幕坐标系有如下图所示的两种: ... 屏幕坐标系和窗口客户区坐标系最明显的区别在于坐标原点屏幕坐标系的坐标原点在整个屏幕的左上角,而窗口客户区
  • 屏幕坐标系和窗口客户区坐标系最明显的区别在于坐标原点屏幕坐标系的坐标原点在整个屏幕的左上角,而窗口客户区坐标系的坐标原点在窗口客户区的左上角,通常这两个点是不重合的。一设备坐标和逻辑坐标 设备坐标...
  • 版权声明:本文为博主原创文章,转载请注明出处(博客... 在VC下进行GDI编程,理解映射方式、设备坐标系、逻辑坐标系、设置逻辑坐标原点和设备坐标原点,真的把我折磨的够厉害的,花了很多时间,终于弄明白一些了...
  • 屏幕坐标系和窗口客户区坐标系最明显的区别在于坐标原点屏幕坐标系的坐标原点在整个屏幕的左上角,而窗口客户区坐标系的坐标原点在窗口客户区的左上角,通常这两个点是不重合的。 一 设备坐标和逻辑坐标  ...
  • cocos2d中的屏幕坐标系和OPenGL坐标系转换 ...cocos2d坐标系(OPenGL坐标系):以左下角为...屏幕坐标系(android,ios,win32系统的坐标系):以左上角为原点,X轴向右为正,y轴向下为正   在cocos2dx的te
  • 屏幕坐标系: 开发中屏幕坐标以屏幕左上角为坐标原点。屏幕坐标中向右X坐标增加,向下是Y轴增加。
  • 在  ...并没有特别说明,下面通过测试Sample来说一下...第一个想说的:世界坐标系,这个坐标很容易,opengl 坐标原点默认给在屏幕中间,一般3D 顶点参照使用这个坐标系,具体参见上面的博客.这里介绍一下着色是如何进行的,工
  • 屏幕坐标系

    千次阅读 2014-09-15 17:43:43
    屏幕坐标系 三点定义一个三角形。当我们在三维图形学中谈论“点(point)”时,我们经常说“顶点(Vertex)”。一个顶点有三个坐标:X,Y和Z。你可以用以下方式来想象这三个坐标: X 在你的右方 Y 在你的上方 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,771
精华内容 6,708
关键字:

屏幕坐标系的原点