我尝试使用" 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);
我应该如何设置我的拼写矩阵?
答案 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