我想计算相同顶点的屏幕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坐标模型。
我是否使用错误的乘法函数或其他错误?
答案 0 :(得分:1)
gl_Position.x和gl_Position.y是screen.x和我假设的verticle的screen.y坐标?
不,他们在剪辑坐标中。要从剪辑到屏幕空间,你必须
p_NDC = p_clip/p.w
(现在坐标在NDC空间中)p_window = (p_NDC + 1)/2 * viewport.{width, height} + viewport{x, y}
人们经常遇到的另一个陷阱是OpenGL的矩阵元素排序是列专业,其中&#34;看起来&#34; (但不是)转换标准符号。我看到你正在使用我linmath.h
库中的代码,我在其中处理了这些代码,即计算完成了专业列,如果你从中获取并传递给OpenGL mat4x4
,那么它就是&#39;以正确的顺序。