在openGL中计算Verticle的屏幕坐标

时间:2014-05-11 07:24:37

标签: opengl graphics vector matrix opengl-es

我想计算相同顶点的屏幕x和y坐标以进行裁剪。 它实际上在着色器中,我只想在我的C代码中做同样的事情。 我的着色器是

uniform mat4 u_MvpMatrix;
attribute vec4 a_Position;
void main(){
    gl_Position = u_MvpMatrix * a_Position;
}

gl_Position.x和gl_Position.y是screen.x和我假设的verticle的screen.y坐标?

有我的C代码,其中model_view_projection_matrix是相同的矩阵,我将其作为u_MvpMatrix放入着色器。

vec4 screen_coords;
vec4 vertex = {0,0,0,1};
mat4x4_mul_vec4(screen_coords, model_view_projection_matrix, vertex);

static inline void mat4x4_mul_vec4(vec4 r, mat4x4 M, vec4 v)
{
int i, j;
for(j=0; j<4; ++j) {
    r[j] = 0.f;
    for(i=0; i<4; ++i)
        r[j] += M[i][j] * v[i];
}
}

但是它给了我矢量screen_coords,其中screen_coords.x和screen_coords.y独立于模型Z坐标。 screen_coords.x仅取决于模型x-position,而screen_coords.y类似。但无用的screen_coords.z和screen_coords.w都依赖于Z坐标模型。

我是否使用错误的乘法函数或其他错误?

1 个答案:

答案 0 :(得分:1)

  

gl_Position.x和gl_Position.y是screen.x和我假设的verticle的screen.y坐标?

不,他们在剪辑坐标中。要从剪辑到屏幕空间,你必须

  1. 执行坐标均匀化p_NDC = p_clip/p.w(现在坐标在NDC空间中)
  2. 将NDC映射到视口坐标p_window = (p_NDC + 1)/2 * viewport.{width, height} + viewport{x, y}
  3. 人们经常遇到的另一个陷阱是OpenGL的矩阵元素排序是列专业,其中&#34;看起来&#34; (但不是)转换标准符号。我看到你正在使用我linmath.h库中的代码,我在其中处理了这些代码,即计算完成了专业列,如果你从中获取并传递给OpenGL mat4x4,那么它就是&#39;以正确的顺序。