如何限制轴上两个坐标之间的 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);  
    }
    ";

你也可以用同样的方式翻译。