OpenGL (перенасыщение) - повысить точность размещения пикселей - PullRequest
0 голосов
/ 25 февраля 2011

Я пытаюсь написать программу, которая отображает окно с имитацией "TV static".У меня это в основном работает, но когда я раскрываю форму линий сетки окна.Я понятия не имею, что может быть причиной этого, поскольку это моя первая программа OpenGL (перенасыщение).Какие-либо предложения?заранее спасибо enter image description here

#include <GLUT/glut.h>
#include <stdlib.h>
#include <time.h>
using namespace std;

void display(void){
    /* clear window */
    glClear(GL_COLOR_BUFFER_BIT);

    int maxy = glutGet(GLUT_WINDOW_HEIGHT);
    int maxx = glutGet(GLUT_WINDOW_WIDTH);

    glBegin(GL_POINTS);

    for (int y = 0; y <= maxy; ++y) {
        for (int x = 0; x <= maxx; ++x) {

        glColor3d(rand() / (float) RAND_MAX,rand() / (float) RAND_MAX,rand() / (float) RAND_MAX);

        glVertex2i(x, y);
    }
}
            glEnd();


/* flush GL buffers */

glFlush();

}


void init(){
/* set clear color to black */
glClearColor (0.0, 0.0, 0.0, 1.0);

/* set fill  color to white */
glColor3f(1.0, 1.0, 1.0);

/* set up standard orthogonal view with clipping */
/* box as cube of side 2 centered at origin */
/* This is default view and these statement could be removed */
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
glOrtho(0, glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT), 0, 0, 1);
glDisable(GL_DEPTH_TEST);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();
}

int main(int argc, char** argv){
srand(time(NULL));
/* Initialize mode and open a window in upper left corner of screen */
/* Window title is name of program (arg[0]) */
glutInit(&argc,argv);

//You can try the following to set the size and position of the window

 glutInitWindowSize(500,500);
 glutInitWindowPosition(0,0);

glutCreateWindow("simple");

glutDisplayFunc(display);
init();
glutIdleFunc(display);
glutMainLoop();
}

Редактировать: я могу удалить строки, используя glRecti;однако, чем больше окно, тем больше пиксели.

Ответы [ 3 ]

3 голосов
/ 25 февраля 2011

Используйте

void glutReshapeFunc(void (*func)(int width, int height));

для сброса проекции, glOrtho, когда размер окна изменяется.

В вашем случае это нужно сделать:

void resize(int width,int height)
{
  glOrtho(0, width, height, 0, 0, 1);
}

int main(int argc, char** argv){
  //...
  glutReshapeFunc(resize);

  glutDisplayFunc(display);
  init();
  glutIdleFunc(display);
  glutMainLoop();
}
2 голосов
/ 25 февраля 2011

Ваш экран width*height размера, но вы на самом деле рисуете (width+1)*(height+1) точек. Кроме того, ваши граничные пиксели отображаются прямо на граничных линиях, поэтому я не уверен, что они будут видны.

Решение:

for (int y = 0; y < maxy; ++y) {
    for (int x = 0; x < maxx; ++x) {
        glColor3d(rand() / (float) RAND_MAX,rand() / (float) RAND_MAX,rand() / (float) RAND_MAX);
        glVertex2f(x+0.5f, y+0.5f);
    }
}

Обратите внимание на изменение условий цикла и типа вызова glVertex.

1 голос
/ 25 февраля 2011

Похоже, внутренняя идея glut о размере окна не обновляется при изменении размера окна.Вам может понадобиться обработчик изменения размера окна.

...