如何使用u_transformation在OpenGL中裁剪/剪辑

时间:2016-02-10 20:18:43

标签: opengl

我尝试使用" u_transformation"来裁剪/剪辑着色器在OpenGL中。具体来说,我只想保留顶部的一半。不应更改视口。我尝试了以下代码,它做了一些事情,但结果很奇怪而不是我所期待的:

gfloat left = -1.0f;
gfloat right = 1.0f;
gfloat bottom = 0.0f;//-1.0f gives the identity matrix and I see everything
gfloat top = 1.0f;
gfloat far = 1.0f;
gfloat near = -1.0f;

gfloat r_l = right - left;
gfloat t_b = top - bottom;
gfloat f_n = far - near;
gfloat tx = - (right + left) / (right - left);
gfloat ty = - (top + bottom) / (top - bottom);
gfloat tz = - (far + near) / (far - near);

gfloat orthographicMatrix[16];
orthographicMatrix[0] = 2.0f / r_l;
orthographicMatrix[1] = 0.0f;
orthographicMatrix[2] = 0.0f;
orthographicMatrix[3] = tx;

orthographicMatrix[4] = 0.0f;
orthographicMatrix[5] = 2.0f / t_b;
orthographicMatrix[6] = 0.0f;
orthographicMatrix[7] = ty;

orthographicMatrix[8] = 0.0f;
orthographicMatrix[9] = 0.0f;
orthographicMatrix[10] = 2.0f / f_n;
orthographicMatrix[11] = tz;

orthographicMatrix[12] = 0.0f;
orthographicMatrix[13] = 0.0f;
orthographicMatrix[14] = 0.0f;
orthographicMatrix[15] = 1.0f;

glUniformMatrix4fv(glGetUniformLocation(program_handle, "u_transformation"), 1, FALSE, orthographicMatrix);

我应该如何设置我的拼写矩阵?

编辑1 这是我拥有的,我得到的和我想要的图片。 Result

2 个答案:

答案 0 :(得分:1)

OpenGL期望矩阵以列主要顺序存储。因此,平移向量进入矩阵元素12,13和14:

orthographicMatrix[0] = 2.0f / r_l;
orthographicMatrix[1] = 0.0f;
orthographicMatrix[2] = 0.0f;
orthographicMatrix[3] = 0.0f;

orthographicMatrix[4] = 0.0f;
orthographicMatrix[5] = 2.0f / t_b;
orthographicMatrix[6] = 0.0f;
orthographicMatrix[7] = 0.0f;

orthographicMatrix[8] = 0.0f;
orthographicMatrix[9] = 0.0f;
orthographicMatrix[10] = 2.0f / f_n;
orthographicMatrix[11] = 0.0f;

orthographicMatrix[12] = tx;
orthographicMatrix[13] = ty;
orthographicMatrix[14] = tz;
orthographicMatrix[15] = 1.0f;

这是假设您在GLSL代码中将向量与左边的矩阵相乘,例如:

gl_Position = u_transformation * inPosition;

另一个问题是如何设置bottom值:

gfloat bottom = 0.0f;//-1.0f gives the identity matrix and I see everything
gfloat top = 1.0f;

您似乎假设这些值指定了字母映射到的窗口范围。计算矩阵的方式并非如此。这些值指定映射到窗口大小的输入坐标范围。

在您的示例中,您似乎使用[-1.0,1.0]的坐标范围来​​绘制字母。使用单位矩阵,它直接映射到OpenGL规范化设备坐标,其范围也为[-1.0,1.0],这使得字母映射到整个窗口。

现在,如果对bottom使用0.0,则表示您将[0.0,1.0]的输入坐标范围映射到窗口大小,即字母的上半部分。

要使字母仅填充窗口的一半,您需要将较大坐标范围映射到窗口大小。在草图之后,范围应为[-3.0,1.0]。有了这个,范围的中间是-1.0,这意味着字母的底部,其y坐标为-1.0,映射到窗口的中间。

基于此,您应将值设置为:

gfloat bottom = -3.0f;
gfloat top = 1.0f;

答案 1 :(得分:0)

设置 orthographicMatrix [10] = -2.0f / f_n;

您可以获得有关计算投影矩阵的详细信息。 http://www.songho.ca/opengl/gl_projectionmatrix.html#ortho