如何限制轴上两个坐标之间的 OpenGL 绘图?
How does one restrict drawing in OpenGL between two coordinates in the axis?
我是一名新的 opengl 程序员。我正在以 3D 图形格式绘制由数千个三角形组成的高度图。它们被缩放,以便它们在三个轴上绘制在 -1 和 +1 之间。现在我只能在 X 轴上进行缩放,并且能够通过应用适当的缩放和平移矩阵在 X 轴上进行平移。这有效地允许我放大数据并根据我的选择在 x 方向上移动它。
问题是,一旦我缩放,x 方向上的数据现在延伸到图形边界的 -1 到 + 1 区域之外。我不希望显示此数据。
这在现代 OpenGL 中是如何完成的?
谢谢
编辑:
矩阵如下:
plottingProgram["projection_matrix"].SetValue(Matrix4.CreatePerspectiveFieldOfView(0.45f, (float)width / height, 0.1f, 1000f));
plottingProgram["view_matrix"].SetValue(Matrix4.LookAt(new Vector3(0, 0, 10), Vector3.Zero, new Vector3(0, 1, 0)));
顶点着色器是
public static string VertexShader = @"
#version 130
in vec3 vertexPosition;
out vec2 textureCoordinate;
uniform mat4 projection_matrix;
uniform mat4 view_matrix;
uniform mat4 model_matrix;
void main(void)
{
textureCoordinate = vertexPosition.xy;
gl_Position = projection_matrix * view_matrix * model_matrix * vec4(vertexPosition, 1);
}
";
这是图表的 link:
http://va2fsq.com/wp-content/uploads/graph.jpg
谢谢
我解决了这个问题。在尝试了很多类似 glScissor 的东西之后,我偶然发现了 glClip_distance。所以我最初的尝试在着色器中放置了一个 Uniform,它被设置为
in vec3 vertexPosition;
uniform vec4 plane0 = (-1,0,0,1);
uniform vec4 plane1 = (1,0,0,1);
void main(void)
{
gl_ClipDistance[0] = dot(vec4(vertexPosition,1), plane0;
gl_ClipDistance[1] = dot(vec4(vertexPosition,1), plane2;
现在的问题是 vec4 平面被任何模型矩阵缩放或变换缩放和平移。所以那是行不通的。所以解决方案是将剪辑向量移到顶点着色器之外,并对它们应用相反的缩放比例,如下所示:
Vector4 clip1 = new Vector4(-1, 0, 0, 1.0f / scale);
Vector4 clip2 = new Vector4(1, 0, 0, 1.0f / scale);
plottingProgram["model_matrix"].SetValue(Matrix4.CreateScaling(new Vector3(scale,1,1)) * Matrix4.CreateTranslation(new Vector3(0,0,0)) *Matrix4.CreateRotationY(yangle) * Matrix4.CreateRotationX(xangle));
plottingProgram["plane0"].SetValue(clip1);
plottingProgram["plane1"].SetValue(clip2);
完整的顶点着色器由
给出
public static string VertexShader = @"
#version 130
in vec3 vertexPosition;
out vec2 textureCoordinate;
uniform mat4 projection_matrix;
uniform mat4 view_matrix;
uniform mat4 model_matrix;
uniform vec4 plane0;
uniform vec4 plane1;
void main(void)
{
textureCoordinate = vertexPosition.xy;
gl_ClipDistance[0] = dot(vec4(vertexPosition,1), plane0);
gl_ClipDistance[1] = dot(vec4(vertexPosition,1), plane1);
gl_Position = projection_matrix * view_matrix * model_matrix * vec4(vertexPosition, 1);
}
";
你也可以用同样的方式翻译。
我是一名新的 opengl 程序员。我正在以 3D 图形格式绘制由数千个三角形组成的高度图。它们被缩放,以便它们在三个轴上绘制在 -1 和 +1 之间。现在我只能在 X 轴上进行缩放,并且能够通过应用适当的缩放和平移矩阵在 X 轴上进行平移。这有效地允许我放大数据并根据我的选择在 x 方向上移动它。 问题是,一旦我缩放,x 方向上的数据现在延伸到图形边界的 -1 到 + 1 区域之外。我不希望显示此数据。 这在现代 OpenGL 中是如何完成的? 谢谢 编辑: 矩阵如下:
plottingProgram["projection_matrix"].SetValue(Matrix4.CreatePerspectiveFieldOfView(0.45f, (float)width / height, 0.1f, 1000f));
plottingProgram["view_matrix"].SetValue(Matrix4.LookAt(new Vector3(0, 0, 10), Vector3.Zero, new Vector3(0, 1, 0)));
顶点着色器是
public static string VertexShader = @"
#version 130
in vec3 vertexPosition;
out vec2 textureCoordinate;
uniform mat4 projection_matrix;
uniform mat4 view_matrix;
uniform mat4 model_matrix;
void main(void)
{
textureCoordinate = vertexPosition.xy;
gl_Position = projection_matrix * view_matrix * model_matrix * vec4(vertexPosition, 1);
}
";
这是图表的 link: http://va2fsq.com/wp-content/uploads/graph.jpg
谢谢
我解决了这个问题。在尝试了很多类似 glScissor 的东西之后,我偶然发现了 glClip_distance。所以我最初的尝试在着色器中放置了一个 Uniform,它被设置为
in vec3 vertexPosition;
uniform vec4 plane0 = (-1,0,0,1);
uniform vec4 plane1 = (1,0,0,1);
void main(void)
{
gl_ClipDistance[0] = dot(vec4(vertexPosition,1), plane0;
gl_ClipDistance[1] = dot(vec4(vertexPosition,1), plane2;
现在的问题是 vec4 平面被任何模型矩阵缩放或变换缩放和平移。所以那是行不通的。所以解决方案是将剪辑向量移到顶点着色器之外,并对它们应用相反的缩放比例,如下所示:
Vector4 clip1 = new Vector4(-1, 0, 0, 1.0f / scale);
Vector4 clip2 = new Vector4(1, 0, 0, 1.0f / scale);
plottingProgram["model_matrix"].SetValue(Matrix4.CreateScaling(new Vector3(scale,1,1)) * Matrix4.CreateTranslation(new Vector3(0,0,0)) *Matrix4.CreateRotationY(yangle) * Matrix4.CreateRotationX(xangle));
plottingProgram["plane0"].SetValue(clip1);
plottingProgram["plane1"].SetValue(clip2);
完整的顶点着色器由
给出 public static string VertexShader = @"
#version 130
in vec3 vertexPosition;
out vec2 textureCoordinate;
uniform mat4 projection_matrix;
uniform mat4 view_matrix;
uniform mat4 model_matrix;
uniform vec4 plane0;
uniform vec4 plane1;
void main(void)
{
textureCoordinate = vertexPosition.xy;
gl_ClipDistance[0] = dot(vec4(vertexPosition,1), plane0);
gl_ClipDistance[1] = dot(vec4(vertexPosition,1), plane1);
gl_Position = projection_matrix * view_matrix * model_matrix * vec4(vertexPosition, 1);
}
";
你也可以用同样的方式翻译。