glBegin (GL_LINES) работает, но glBegin (GL_POINTS) не работает правильно? - PullRequest
0 голосов
/ 25 апреля 2018

У меня следующий код для чтения данных из Lion.bmp и отображения изображения.

#include<GL/gl.h>
#include<GL/glut.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<unistd.h>

unsigned char data[1000000]; // allocate 3 bytes per pixel
int size;
int width;
int height;

void
drawRGB()
{
    glClearColor(0, 0, 0, 1);
    glClear(GL_COLOR_BUFFER_BIT);
    int i,j;
    for(i=0;i<height;i++)
    {
        for(j=0;j<width;j++)
        {
            /* double R=data[3 * (i * width + j)]/255.0; */
            /* double G=data[3 * (i * width + j) + 1]/255.0; */
            /* double B=data[3 * (i * width + j) + 2]/255.0; */
            /* printf("R=%lf G=%lf B=%lf\n",R,G,B); */
            printf("i=%d j=%d\n",i,j);
            glColor3f(1,0,0);
            glBegin(GL_POINTS);
            glVertex2i(i,j);
            glEnd();
            glFlush();
        }
    }
}

void readBMP(char* filename)
{
    printf("inside readBMP\n");
    int i;
    FILE* f = fopen(filename, "rb");
    unsigned char info[54];
    fread(info, sizeof(unsigned char), 54, f); // read the 54-byte header

    // extract image height and width from header
    width = *(int*)&info[18];
    height = *(int*)&info[22];
    printf("widht = %d height= %d\n",width, height);

    int size = 3 * width * height;
    fread(data, sizeof(unsigned char), size, f); // read the rest of the data at once
    fclose(f);

    for(i = 0; i < size; i += 3)
    {
            unsigned char tmp = data[i];
            data[i] = data[i+2];
            data[i+2] = tmp;
    }
    printf("last in readBMP\n");
}


void
init(void)
{
    /*initialize the x-y co-ordinate*/

    /* glClearColor(0,0,0,0); */
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, width,0, height);
    /* glClear(GL_COLOR_BUFFER_BIT); */
    glFlush();
}



int
main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    /* glutInitWindowSize(1000, 1000); */
//  glutInitWindowPosition(400, 400);
    readBMP("Lion.bmp"); 
    init();
    printf("after\n");
    glutCreateWindow("RGB");
    glutDisplayFunc(drawRGB);
    /* drawRGB(); */
    glutMainLoop();
}

Для отладки, когда я ставлю glBegin(GL_LINES), это работает, но если поставить glBegin(GL_POINTS), это не работает. Нарисованы только две точки.

glBegin(GL_LINES);
glVertex2i(0,0);
glVertex2i(i,j);
glEnd();

Вышеуказанные работы по замене.

Lion.bmp

Для строки

Для точки

Compile
gcc bmpRead.c -lglut -lGLU -lGL

1 Ответ

0 голосов
/ 25 апреля 2018

Настройка ортографической проекции (gluOrtho2D) не работает, поскольку для любого введения в OpenGL требуется действительный и текущий Контекст OpenGL .

Окно и контекст OpenGL создаются с помощью glutCreateWindow, но это делается после вызова init() (который выполняет инициализацию сцены как gluOrtho2D).

Позвоните init() после glutCreateWindow, чтобы решить вашу проблему:

readBMP("Lion.bmp"); 

glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutCreateWindow("RGB");
init(); // <------------------- after "glutCreateWindow"    

glutDisplayFunc(drawRGB);
glutMainLoop();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...