首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL ES 2D将NDC转换为屏幕坐标

OpenGL ES 2D将NDC转换为屏幕坐标
EN

Stack Overflow用户
提问于 2014-12-28 22:22:22
回答 1查看 396关注 0票数 0

我使用OpenGL ES只绘制2D形状,我必须创建自己的矩阵并将它们传递给着色器。

我只使用3x3矩阵和2个分量向量。我知道,对于2D,仍然有4x4矩阵和3个分量向量,Z设置为1,但我想知道是否可以保留它。

我让所有的矩阵工作,平移旋转和缩放所有的工作。我所缺少的是一个“投影”矩阵,我所有的位置都在-1到1之间,而且我的形状是变形的,因为我的手机的纵横比不是1。我需要一个矩阵,用正确的比例将我所有的坐标映射到屏幕上。

通常,您会使用一个正交投影矩阵来完成这个映射,但是这些都是4x4。如何使用3x3矩阵进行此映射?如果我不能,有没有办法保持矩阵3x3,并以其他方式映射它?(我可以在没有矩阵的情况下插值坐标,但这不能解决比率问题)

为了澄清,这里是我的顶点着色器,如您所见,我使用的是一个3x3转换矩阵和2个组件向量:

代码语言:javascript
复制
uniform mat3 u_transform_mat;   

attribute vec2 a_vert_pos;  
attribute vec2 a_vert_uv;     

varying vec2 v_vert_uv;       

void main()                 
{                           
   v_vert_uv = a_vert_uv;       

   gl_Position = vec4(u_transform_mat * vec3(a_vert_pos, 1.0), 1.0);
}                                 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-28 22:51:09

在这种情况下,你真正需要做的“投影”矩阵就是比例。

比如说,你有景观屏幕尺寸,你的纵横比是1.5。随着您现在的转换,NDC范围的-1,1将扩大,以适应屏幕的宽度,这意味着,这是一个因子1.5的水平方向相对于垂直方向。

你想要保持比例不变的是把范围- 1.5,1.5的x方向和范围-1,1的y方向到屏幕上。或者在更一般的情况下,-aspect,在x方向的方面。

要将-aspect的方面范围映射为-1,1的NDC范围,您需要将x坐标缩放为(1 /方面)。因此,您的“投影”矩阵是一个只在x方向上缩放的非均匀缩放矩阵:

代码语言:javascript
复制
    [ 1.0f / aspectRatio  0.0f  0.0f ]
P = [        0.0f         1.0f  0.0f ]
    [        0.0f         0.0f  1.0f ]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27681177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档