[C++] OpenGL maakt witte lijnen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • williewonka03
  • Registratie: Augustus 2010
  • Laatst online: 16-06-2024
hallo allemaal ik heb een beetje raar probleem. ik teken een kaart naar het scherm door pixel bij pixel dit naar het scherm te sturen. _map is een twee dimensionale matrix gemaakt met std::vector. Ik heb de pixels in de matrix naar een txt bestand gedumpt en geverifieerd dat deze kloppen met het plaatje dat ik wil tekenen.als ik render dan krijg ik echter dit:
Afbeeldingslocatie: http://i.imgur.com/hQ84xEn.png

mijn glut init:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH | GLUT_ALPHA); // Double buffering, RGB format
    glutInitWindowSize(width, heigth);
    glutInitWindowPosition(0, 0);
    glutCreateWindow("Test Plaatje");
    glClearColor(1.0, 1.0, 1.0, 1.0);

    glColor3f(1.0, 1.0, 1.0);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0.0, 1024, 0.0, 500);
    glMatrixMode(GL_MODELVIEW);


en mijn teken functie
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
...
std::vector<std::vector<RGB>> _map = std::vector<std::vector<RGB>>();
...
struct RGB
{
    int R;
    int G;
    int B;
};
...

//de teken functie
void Map::draw()
{
    glBegin(GL_POINTS);

    for (int x = 0; x < _w; x++)
    {
        for (int y = 0; y < _h; y++)
        {
            RGB pixel = _map[y][x];
            glColor3ub(pixel.R, pixel.G, pixel.B);
            glVertex2i(_p[0] + x, _p[1] + y);
        }
    }

    glEnd();
}


weet iemand hoe ik dit fatsoenlijk kan debuggen en fixen?

Acties:
  • 0 Henk 'm!

  • michelvosje
  • Registratie: December 2009
  • Laatst online: 11-09 19:05
Ik weet het niet zeker. Maar ik meen me te herinneren dat je met 0.375 pixels moet transleren.

https://www.opengl.org/di...e-0-375-pixel-translation

MSDN: OpenGL Correctness Tips (Windows)

Dit is al weer een tijdje geleden voor mij xD.

Acties:
  • 0 Henk 'm!

  • williewonka03
  • Registratie: Augustus 2010
  • Laatst online: 16-06-2024
michelvosje schreef op maandag 22 december 2014 @ 15:34:
Ik weet het niet zeker. Maar ik meen me te herinneren dat je met 0.375 pixels moet transleren.

https://www.opengl.org/di...e-0-375-pixel-translation

MSDN: OpenGL Correctness Tips (Windows)

Dit is al weer een tijdje geleden voor mij xD.
hmm dit heb ik nog nooit eerder gezien, maar helaas werkt het niet. ik zie nog steeds dezelfde witte lijnen. mss gebruik ik het verkeerd, ik heb het in de init gezet wat niet werkte en ik heb het geprobeerd vlak na de glbegin te zetten maar ook dat werkte niet.

[ Voor 10% gewijzigd door williewonka03 op 22-12-2014 15:50 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Ik gok dat het een afrondingsfoutje is, waardoor de x van sommige pixels afgerond op de verkeerde kolom terechtkomt (zou een driver-bug kunnen zijn).
Mijn advies is om glVertex2f() te gebruiken, en iets te experimenteren met de coordinaten achter de komma.
Kijken of je dan de pixels WEL op de goede plek kunt krijgen (zoals gezegd, je wil ze in de pixel centers hebben, en die liggen binnen (0.5,0.5) bij OpenGL).
0.375 is niet de oplossing als je alleen integers wil gebruiken, is meer een kunstgreep die een compromis is tussen beide.

(Wat eventueel zou kunnen is dat die integer-fouten komen omdat je FPU in een andere rounding-mode staat dan dat OpenGL verwacht. Door glVertex2f() te gebruiken, zou dat niet uit moeten maken).

[ Voor 15% gewijzigd door Verwijderd op 22-12-2014 16:48 ]


Acties:
  • 0 Henk 'm!

  • williewonka03
  • Registratie: Augustus 2010
  • Laatst online: 16-06-2024
Verwijderd schreef op maandag 22 december 2014 @ 16:47:
Ik gok dat het een afrondingsfoutje is, waardoor de x van sommige pixels afgerond op de verkeerde kolom terechtkomt (zou een driver-bug kunnen zijn).
Mijn advies is om glVertex2f() te gebruiken, en iets te experimenteren met de coordinaten achter de komma.
Kijken of je dan de pixels WEL op de goede plek kunt krijgen (zoals gezegd, je wil ze in de pixel centers hebben, en die liggen binnen (0.5,0.5) bij OpenGL).
0.375 is niet de oplossing als je alleen integers wil gebruiken, is meer een kunstgreep die een compromis is tussen beide.

(Wat eventueel zou kunnen is dat die integer-fouten komen omdat je FPU in een andere rounding-mode staat dan dat OpenGL verwacht. Door glVertex2f() te gebruiken, zou dat niet uit moeten maken).
het probleem is dat als ik puur floating gebruik hij nog steeds deze error geeft als ik mijn integers naar floats cast. hoe kan ik die rounding mode checken?

Acties:
  • 0 Henk 'm!

Verwijderd

williewonka03 schreef op maandag 22 december 2014 @ 16:57:
[...]
het probleem is dat als ik puur floating gebruik hij nog steeds deze error geeft als ik mijn integers naar floats cast.
Ik zeg ook dat je achter de komma moet experimenteren. Dus bv zoiets:
glVertex2f(_p[0] + x + 0.5f, _p[1] + y + 0.5f);
hoe kan ik die rounding mode checken?
Met Windows heb je daar de volgende intrinsics voor: MSDN: _control87, _controlfp, __control87_2

Acties:
  • 0 Henk 'm!

  • williewonka03
  • Registratie: Augustus 2010
  • Laatst online: 16-06-2024
Verwijderd schreef op maandag 22 december 2014 @ 17:00:
[...]


Ik zeg ook dat je achter de komma moet experimenteren. Dus bv zoiets:
glVertex2f(_p\[0] + x + 0.5f, _p\[1] + y + 0.5f);


[...]


Met Windows heb je daar de volgende intrinsics voor: MSDN: _control87, _controlfp, __control87_2
hmm heb zojuist 0.1 tot 0.9 geprobeerd maar ook dat werkt niet. mss moet ik gewoon alle coordinaten in float uitdrukken.

Acties:
  • 0 Henk 'm!

  • williewonka03
  • Registratie: Augustus 2010
  • Laatst online: 16-06-2024
na een tip van stackoverflow heb ik dit:
code:
1
2
3
    glEnable(GL_BLEND);
    glEnable(GL_POINT_SMOOTH);
    glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);

aan het eind van mijn init gezet en nu werkt het!
Pagina: 1