OpenGL рисовать в 2D-координатах вместо системы координат вершин

Как я могу рисовать в 2D-координаты вместо системы координат вершины, как это =>

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);

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.

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) — центр нижнего правого пикселя.
0

По вопросам рекламы [email protected]