简体   繁体   中英

opengl glfw draw polygon

I using openGL to draw a concave, but first concave(subject) is mistake. it has 4 points, but display is 3 points , Why?

#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;
}

In addition, I have a problem about while(!glfwWindowShouldClose(window)) , how to terminate the render loop?

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

is run always. It's mistake.

To summarize your questions:

  • Either split your polygon into several parts (eg by hand or for bigger ones by tessellation ) or use the GL_STENCIL_TEST (see comment from Rabbid76 above).
  • Using while(!glfwWindowShouldClose(window) && glfwGetKey(window_, GLFW_KEY_ESCAPE) != GLFW_PRESS); should work to exit the window. Code suggestion taken from Window not closing GLFW .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM