opengl glfw绘制多边形

时间:2018-04-19 03:15:53

标签: opengl polygon glfw concave

我使用openGL绘制凹面,但第一个凹面(主体)是错误的。 it has 4 points, but display is 3 points,为什么?

#include <iostream>
#include <vector>
#include <GL/glew.h>
#include <GLFW/glfw3.h>


struct Point2D
{
    double m_x;
    double m_y;

    Point2D(int x, int y)
    : m_x(x), m_y(y)
    {

    }
};

void render()
{
    glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    std::vector<Point2D> subject;
    subject.push_back(Point2D(0, 100));
    subject.push_back(Point2D(75, 0));
    subject.push_back(Point2D(200, 50));
    subject.push_back(Point2D(100, 50));

    std::vector<Point2D> clip;
    clip.push_back(Point2D(125, 175));
    clip.push_back(Point2D(-15, 50));
    clip.push_back(Point2D(70, 85));
    clip.push_back(Point2D(75, 25));

    std::vector<std::vector<Point2D> > vPolygon;
    vPolygon.push_back(subject);
    vPolygon.push_back(clip);

    //
    int sizei = (int)vPolygon.size();
    for (int i = 0; i < sizei; ++i)
    {
        if (0 != i)
        {
            continue;
        }

        glLineWidth(2.0);
        glBegin(GL_POLYGON);

        auto polygon = vPolygon[i];
        int sizej = (int)polygon.size();
        for (int j = 0; j < sizej; ++j)
        {
            auto coordX = polygon[j].m_x;
            auto coordY = polygon[j].m_y;

            printf("%f\t%f\n", coordX, coordY);

            //glColor3f(k & 0x04, k & 0x02, k & 0x01);
            glVertex2f((float)(coordX - 100.) / 200., (float)(coordY - 120.) / 200.);
        }

        glEnd();
    }
}


int main()
{    
    GLFWwindow* window;

    // Initialize the library
    if(!glfwInit())
    {
        std::cout << "Failed to initialize GLFW!\n";
        return -1;
    }

    // Create a windowed mode window and its OpenGL context
    window = glfwCreateWindow(640, 480, "base", NULL, NULL);
    if(!window)
    {
        glfwTerminate();

        std::cout << "Failed to create window using GLFW!\n";
        return -1;
    }

    // Make the window's context current
    glfwMakeContextCurrent(window);

    // init glew
    glewExperimental = GL_TRUE;
    if(glewInit())
    {
        std::cout << "Failed to init GLEW!\n";
        return -1;
    }

    // Loop until the user closes the window
    while(!glfwWindowShouldClose(window))
    {
        // if Esc is pressed, close the window
        if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
        {
            glfwSetWindowShouldClose(window, GLFW_TRUE);
        }

        // render
        render();

        // Swap front and back buffers
        glfwSwapBuffers(window);

        // Poll for and process events
        glfwPollEvents();
    }

    glfwTerminate();

    exit(EXIT_SUCCESS);

    return 0;
}

另外,我有一个关于while(!glfwWindowShouldClose(window))的问题,如何终止渲染循环?

printf("%f\t%f\n", coordX, coordY);
总是运行

。这是错误的。

1 个答案:

答案 0 :(得分:0)

总结一下你的问题:

  • 将多边形分成几个部分(例如,通过tessellation手工或更大的部分)或使用GL_STENCIL_TEST(参见上面Rabbid76的评论)。
  • 使用while(!glfwWindowShouldClose(window) && glfwGetKey(window_, GLFW_KEY_ESCAPE) != GLFW_PRESS);应该可以退出窗口。 代码建议取自Window not closing GLFW