0

我如何绘制二维坐标而不是顶点坐标系,因为这 =>

drawPoint(50 , 100 ,  0.01f);

在此处输入图像描述

这是我的代码,一个背景纹理和一个点

static void Draw(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    double w = glutGet( GLUT_WINDOW_WIDTH ) / 300.0;
    double h = glutGet( GLUT_WINDOW_HEIGHT ) / 300.0;
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glOrtho( -1 * w/2, 1 * w/2, -1 * h/2, 1 * h/2, w/2, -h/2);
    glBegin(GL_POLYGON);
    glTexCoord2f(0.0f, 0.0f); glVertex3f(-w/2.f, -h/2.f,  0.0f);
    glTexCoord2f(1.0f, 0.0f); glVertex3f( w/2.f, -h/2.f,  0.0f);
    glTexCoord2f(1.0f, 1.0f); glVertex3f( w/2.f,  h/2.f,  0.0f);
    glTexCoord2f(0.0f, 1.0f); glVertex3f(-w/2.f,  h/2.f,  0.0f);
    glEnd();

  drawPoint(50 , 100 ,  0.01f);
  glutSwapBuffers();
}

函数 DrawPoint => 画圆

void drawPoint(GLfloat x, GLfloat y, GLfloat radius){
    glDisable(GL_LIGHTING);
    glDisable(GL_TEXTURE_2D);
    int i;
    int triangleAmount = 20; //# of triangles used to draw circle

    //GLfloat radius = 0.8f; //radius
    GLfloat twicePi = 2.0f * 3.1415;

    glBegin(GL_TRIANGLE_FAN);
    glColor3f(1.0, 0.0, 0.0);
        glVertex2f(x, y); // center of circle
        for(i = 0; i <= triangleAmount;i++) {
            glVertex2f(
                    x + (radius * cos(i *  twicePi / triangleAmount)),
                y + (radius * sin(i * twicePi / triangleAmount))
            );
        }
    glEnd();
    glEnable(GL_LIGHTING);
    glEnable(GL_TEXTURE_2D);
}

所以我不知道我是否必须更改 DrawPoint 功能。

更新:这是我的主要来源

 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInit(&argc, argv);
    glutInitWindowSize(widthX, heightY);
    glutCreateWindow("prg");
    glutReshapeFunc(resize);
    glutDisplayFunc(Draw);
    glutKeyboardFunc(keyPressed);
    glutKeyboardUpFunc(keyUp);
    texture[0] = SOIL_load_OGL_texture 
    (
        "img.jpg",
        SOIL_LOAD_AUTO,
        SOIL_CREATE_NEW_ID,
        SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT
    );
    glBindTexture(GL_TEXTURE_2D, texture[0]);
    glEnable(GL_TEXTURE_2D);
    glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
    glEnable(GL_POINT_SMOOTH);
    glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
    glutMainLoop();

更新 2:

如果以这种方式不可能,是否有一种方法可以将 x 和 y 转换为向量?例如:

DrawPoint(VectConvert(50),VectConvert(100),0.01f);

4

2 回答 2

0

只需根据需要设置一个正交投影:

 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 glOrtho( 0, w, h, 0, -1, 1);
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();

请注意这里的几点:

  • 这假定w并且h实际上是视口的宽度和高度。
  • 我把它放入GL_PROJECTION矩阵中。这就是这些东西的归属。(尽管它在您的用例中可能并不重要)。
  • 我将近平面和远平面分别设置为 -1 和 1。我不知道你实际需要什么,但你的价值观没有任何意义。
  • 这将建立一个坐标系,其中像素中心实际上正好在两个整数值之间,整数值表示两个相邻像素之间的中间,因此 (0,0) 将是左上角像素的左上角,并且 ( w,h) 左下角像素的右下角。
  • 您还可以设置将整数映射到像素中心的映射,例如glOrtho(-0.5, w-0.5, h-0.5, -0.5, -1, 1). 现在 (0,0) 是左上像素的中心,(w,h) 在屏幕之外,(w-1,h-1) 是右下像素的中心。
于 2014-06-27T18:37:47.553 回答
0

我不确定这是否是正确的答案。我编辑了你的代码,试试这个:

static void Draw(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    // You divided your window width and height by 300 which seems to be wrong
    double w = glutGet( GLUT_WINDOW_WIDTH );
    double h = glutGet( GLUT_WINDOW_HEIGHT );

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    // Create ortho 2d
    // The last two parameters are near and far planes
    // Since you are using only 2D you should keep them at 0.0 and 1.0
    glOrtho( -1 * w/2.0, 1 * w/2.0, -1 * h/2.0, 1 * h/2.0, 0.0f, 1.0f);
    // Mirror Y axis 
    glScalef(1, -1, 1);
    // Now your coordinate system starts at center of your window
    // You need to move it to the left top corner
    glTranslatef(-(w/2.0f), -(h/2.0f), 0.0f);

    texture[0] = SOIL_load_OGL_texture // load an image file directly as a new OpenGL texture
    (
        "img.jpg",
        SOIL_LOAD_AUTO,
        SOIL_CREATE_NEW_ID,
        SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT
    );

    glBindTexture(GL_TEXTURE_2D, texture[0]);
    glBegin(GL_POLYGON);
    // You need also to mirror your Y coordinates for texture
    glTexCoord2f(0.0f, 1.0f); glVertex3f(0.0f , 0.0f, 0.0f);
    glTexCoord2f(1.0f, 1.0f); glVertex3f(w    , 0.0f, 0.0f);
    glTexCoord2f(1.0f, 0.0f); glVertex3f(w    , h   , 0.0f);
    glTexCoord2f(0.0f, 0.0f); glVertex3f(0.0f , h   , 0.0f);
    glEnd();
    drawPoint(50 , 100 ,  0.01f);
    glutSwapBuffers();
}

另外,不要每帧都从文件中加载纹理。这对你的 GPU 来说太过分了。

于 2014-06-27T18:03:13.140 回答