glreadpixel()没有输出

时间:2018-04-23 06:31:56

标签: c++ opengl

首先感谢您抽出时间。这是一个有很多答案的问题,但它不起作用,在这里我试图举一个例子,让我们看看我们是否可以解决这个问题,也许还有人将来会再次受益。

所以问题是我们有glreadpixel()调用圆上的一个点,这是由bresenham函数绘制的。

但事实是它在改变窗口的背景颜色时甚至没有给出0,0,0的RGB值。

这是大代码,享受实验。我尝试了一切。顺便说一下,我正在开发n macOS(OpenGL是硬件无关的)

using namespace std;
#include <GLUT/glut.h>
#include <iostream>
#include <vector>
#include <CoreGraphics/CoreGraphics.h>
int r = 40;
int flag = 0;
 int cordinates [50][3]=
{

    {50, 50} ,   //0 station
    {400, 450} ,  //1 station
    {750, 250}   //2 station
};
int matrix[50][50] = {

    {0,1,1},
    {1,0,1},
    {1,1,0}

};
int trains[50][50] = {

    {3,4,0,1,999},
    {11,1,1,2,999},
    {0,0,0,999}

};
int x,y;
int *x1, *y3, x2, y2;
int xx,yy,xxx,yyy,p,q,vertexcount,counter;
int xinc,xinc3,i,j,system_time,flag1,time_chekcer_cnt,dda =0;
char buf3[12],buf[12];
float tempx0,tempy0,tempx1,tempy1;
int train0 = 999 ;int start0,speed0,next0,nextx0,nexty0,final0 = 999 ;//999 signifies invalid
int train1 ,start1, speed1,next1,nextx1,nexty1,final1 = 999 ;//999 signifies invalid
int train2 ,start2, speed2,next2,final2 = 999 ;//999 signifies invalid
void init2D()
{
    glClearColor(0,0,0,0.0);
    glMatrixMode (GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D (0.0, 900.0, 0.0, 900.0);
}
;
void bresenham_circle(const int h, const int k,const int r)
{
    int x=0,y=r,p=(3-(2*r));
    do{
        //Read pixel
        unsigned char  pixelub[3];
        //  glReadPixels(<#GLint x#>, <#GLint y#>, <#GLsizei width#>, <#GLsizei height#>, <#GLenum format#>, <#GLenum type#>, <#GLvoid *pixels#>)


        glPointSize(1);
        //draw two points
        glColor3f(1.0, 1.0, 0.0);
         glBegin(GL_POINTS);
        glVertex2i((h+x),(k+y));
        glEnd();
        //color detection start
        glReadPixels
        (
         (h+x),(k+y),
         1, 1,
         GLUT_RGB, GL_UNSIGNED_BYTE, &pixelub
         );

        //print
        cout <<"reading pixel :  "<<(h+x)<<" "<<(k+y);
        printf("r: %u g: %u b: %u\n", pixelub[0], pixelub[1], pixelub[2]);
        cout << endl;
        //end
        glColor3f(1.0, 0.0, 0.0);
         glBegin(GL_POINTS);
        glVertex2i((h+y),(k+x));
        glEnd();
         glBegin(GL_POINTS);
        glVertex2i((h+y),(k-x));
        glEnd();
         glBegin(GL_POINTS);
        glVertex2i((h+x),(k-y));
        glEnd();
         glBegin(GL_POINTS);
        glVertex2i((h-x),(k-y));
        glEnd();
         glBegin(GL_POINTS);
        glVertex2i((h-y),(k-x));
        glEnd();
         glBegin(GL_POINTS);
        glVertex2i((h-y),(k+x));
        glEnd();
         glBegin(GL_POINTS);
        glVertex2i((h-x),(k+y));

        glEnd();

        x++;

        if(p<0){

            p+= ((4*x)+6);


        }else {

            y--;
            p+=(4*(x-y)+10);

        }
    }
        while (x<=y);

}
void drawBitmapText(char *string,float x,float y,float z)
{
    char *c;
    glRasterPos3f(x, y,z);

    for (c=string; *c != NULL; c++)
    {
        glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, *c);
    }
}
void systemtime(){

    sprintf(buf, "%d", system_time); // puts string into buffer
    printf("%s\n", buf);
    sprintf(buf3, "%d", system_time-1); // puts string into buffer

    if(system_time >1){
        glColor3f(1.0, 1.0, 1.0);
        drawBitmapText(buf3,200,200,0);
        glColor3f(0.0, 1.0, 0.0);
        drawBitmapText(buf,200,200,0);
        system_time =system_time+1;

    }else {
        drawBitmapText(buf,200,200,0);
        system_time =system_time+1;
    }

};

void draw_pixel(int x, int y){
    glPointSize(5);
    glColor3f(1.0, 1.0, 0.0);
    glBegin(GL_POINTS);
    cout << "\n THIS IS PRINTING X and Y :"<<x<<" & "<<y<<endl;
    glVertex2i(x, y);
    glEnd();
    glFlush();
}
//bresenham ..... i vant DDA

void draw_dda( float *x0, float *y0, int x1, int y1,int speed) {
              //cout << "\n LOOPING FOR START CORDIANTES :  X0 and Y0 "<<*x0<<*y0<<endl;
              int dx = x1 - *x0;
              int dy = y1 - *y0;
              //GLfloat x1 = p1.x; GLfloat y1 = p1.y;
              GLfloat step = 0;
              if(abs(dx) > abs(dy)) {
                  step = abs(dx);
              } else {
                  step = abs(dy);
              }
              GLfloat xInc = dx/step;
              GLfloat yInc = dy/step;
    for (int speed_count = 0 ; speed_count < speed ; speed_count++){


                  glPointSize(5);
                  glColor3f(1.0, 0.0, 0.0);
                  glBegin(GL_POINTS);
                  //cout << "\n THIS IS PRINTING X and Y :"<<xInc<<" & "<<yInc<<endl;
                  glVertex2i(*x0, *y0);

                  glEnd();

        int cy1 = *y0;
        int cx1 = *x0;
        //cout << "\n calling bresenham";
         glColor3f(1.0, 1.0, 1.0);
        bresenham_circle(cx1, cy1, r);
        //cout << " \n" <<cx1<<" "<<cy1<<" "<<r;
        while (flag != 1){

            r--;
            //cout <<"\n r is "<<r<<endl;
            if (r == 0){
                flag = 1;

            }
        }
        r =40;flag= 0;

        *x0 = *x0+xInc;
        *y0 = *y0+yInc;
         glColor3f(1.0, 0.0, 0.0);
        int cy = *y0;
        int cx = *x0;
        //cout << "\n calling bresenham";
        bresenham_circle(cx, cy, r);
        //cout << " \n" <<cx<<" "<<cy<<" "<<r;
        while (flag != 1){

            r--;
            //cout <<"\n r is "<<r<<endl;
            if (r == 0){
                flag = 1;

            }
        }
        r =40;flag= 0;
                  //cout << "\n THIS IS PRINTING X and Y :"<<xInc<<" & "<<yInc<<endl;

    }

}

void drawline(float *x0, float *y0, int x1, int y1)
{ cout << "\n LOOPING FOR START CORDIANTES :   ("<<*x0<<","<<*y0<<") To ("<<x1<<","<<y1<<")"<<endl;
    int dx, dy, p, x, y;

    dx=x1-*x0;
    dy=y1-*y0;

    x=*x0;
    y=*y0;

    p=2*dy-dx;
    //cout << "X and X1 "<<x<<x1<<endl;
    if   (x<x1)
    {
        if(p>=0)
        {
            draw_pixel(x,y);


            //cout << ">>>>>. Y INCREMENTED >>>>> "<<y<<endl;
            y=y+1;
            p=p+2*dy-2*dx;

        }
        else
        {   //cout << "\n >>>>>NOT  Y INCREMENTED >>>>> "<<y<<endl;
            draw_pixel(x,y);
            //cout << "X and Y "<<x<<y<<endl;
            p=p+2*dy;


        }
        x=x+1;
    }
    *x0=x;
    *y0=y;
    //cout << "\n X  "<<x<<" and Y "<<y<<endl;
    //cout << "\n X0 "<<*x0<<" and Y0 "<<*y0<<endl;
}

void display_ndots()
{glClear(GL_COLOR_BUFFER_BIT);
    glPointSize(5);
    glColor3f(1.0, 0.0, 0.0);
    //draw two points
    glBegin(GL_POINTS);
    for(int i = 0; i < 10; i++)
    {   xx = cordinates[i][0];
        yy = cordinates[i][1];
        glVertex2i(xx,yy);
        //printf("%i",xx);
    }
    glEnd();

    glColor3f(0.0, 1.0, 0.0);
    //draw a line


    glLineWidth(3);
    glBegin(GL_LINES);
    for(counter = 0 ; counter < 3 ; counter ++){
        for (p = 0 ; p < 3 ; p ++){

            for (q = 0 ; q < 3 ; q ++){

                if( matrix[p][q] == 1){

                    xx = cordinates[p][0];
                    yy = cordinates[p][1];
                    xxx = cordinates[q][0];
                    yyy = cordinates[q][1];
                    glVertex2i(xx,yy);
                    glVertex2i(xxx,yyy);
                }

            }

        }

    }
    glEnd();

    systemtime();
    time_chekcer_cnt = 0;
    for(time_chekcer_cnt = 0 ; time_chekcer_cnt <10 ; time_chekcer_cnt ++){

        if (system_time == trains[time_chekcer_cnt][0]){

            switch (time_chekcer_cnt)
            {
                case 0:  printf("Trian number %i have been started  server time  is %i \n",time_chekcer_cnt,system_time);

                    /*Initializing Train Data*/
                    train0 = time_chekcer_cnt;
                    speed0 = trains[time_chekcer_cnt][1];
                    start0 = trains[time_chekcer_cnt][2];
                    cout<<"\n >>>>>>>>>>>>>"<<start0<<endl;
                    tempx0 = cordinates[start0][0];
                    tempy0 = cordinates[start0][1];
                    next0 = trains[time_chekcer_cnt][3];
                    nextx0 = cordinates[next0][0];
                    nexty0 = cordinates[next0][1];
                    ;
                    i=0;
                    while (trains[time_chekcer_cnt][i] != 999) {
                        i = i+1;
                    }

                    final0 = trains[time_chekcer_cnt][i-1];//999 signifies invalid
                    printf("\nfinal station is %i \n",final0);
                     //tempx01 = cordinates[start0][0]+10;
                     //tempy01 = cordinates[start0][1];
                    break;
                case 1:
                    printf("Trian number %i have been started  server time  is %i \n",time_chekcer_cnt,system_time);

                    /*Initializing Train Data*/
                    train1 = time_chekcer_cnt;
                    speed1 = trains[time_chekcer_cnt][1];
                    start1 = trains[time_chekcer_cnt][2];
                    cout<<"\n >>>>>>>>>>>>>"<<start0<<endl;
                    tempx1 = cordinates[start0][0];
                    tempy1 = cordinates[start0][1];
                    next1 = trains[time_chekcer_cnt][3];
                    nextx1 = cordinates[next0][0];
                    nexty1 = cordinates[next0][1];
                    ;
                    i=0;
                    while (trains[time_chekcer_cnt][i] != 999) {
                        i = i+1;
                    }

                    final1 = trains[time_chekcer_cnt][i-1];//999 signifies invalid
                    printf("\nfinal station is %i \n",final0);
                    break;
                    //default: // code to be executed if n doesn't match any cases
            }
        }
    }

    if (train0 != 999){

        glColor3f(1.0, 1.0, 0.0);

        draw_dda( &tempx0, &tempy0 ,nextx0, nexty0,speed0);
         cout << "Draving from corinates ("<<tempx0<<","<<tempy0<<") To ("<<nextx0<<","<<nexty0<<")"<<endl;


    }
    if (train1 != 999){

        glColor3f(1.0, 1.0, 0.0);

        ///  cout << "original x and y are "<<nextx0<<" & "<<nexty0;
        draw_dda( &tempx1, &tempy1 ,nextx1, nexty1,speed1);
        cout << "Draving from corinates ("<<tempx0<<","<<tempy0<<") To ("<<nextx0<<","<<nexty0<<")"<<endl;
        // drawline( &tempx0, &tempy0 ,nextx0, nexty0);
        //draw_dda( &tempx01, &tempy01 ,nextx0+10, nexty0);
        // cout<<"After call by reference it is :"<<nextx0<<" & "<<nexty0;

    }
    /*bresenham_circle(100, 100, r);

        while (flag != 1){

            r--;
            cout <<"\n r is "<<r<<endl;
            if (r == 0){
                flag = 1;
            }
        }*/

    glFlush();
   glGetError();
}


void timlycall (int unused) {

    glutPostRedisplay();
    glutTimerFunc(1000, timlycall, 0);


}
int main(int argc,char *argv[])
{
    glutInit(&argc,argv);
    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize (900, 900);
    glutInitWindowPosition (0, 0);
    glutCreateWindow ("points and lines");
    init2D();

    glutDisplayFunc(display_ndots);
    //glutDisplayFunc(init2D);
    glutTimerFunc(0, timlycall, 0);
    glutMainLoop();
    return 0;
}

请不要macos有库GLUT但是窗口有GL

更新1.0

好的,我们取得了一些进展:

  • 在glreadpixel()中使用GLUT_RGB给出错误代码1280,即检测到 通过BDL提供的方法。哪个代表不正确的枚举, 所以在glreadpixel()

  • 中使用GL_RGB
  • 现在我们要解决一个有趣的问题,即现在的GlReadPixel 给出r:255 g: 255 b: 255作为输出,即背景颜色 而不是必须是黄色的颜色,因为我们称之为 功能点也位于其后的圆上 绘。

1 个答案:

答案 0 :(得分:1)

您将错误的枚举传递给glReadPixelsGLUT_RGBGL_RGB不同,因此不能用于此功能。

这会被GL_INVALID_ENUM报告为glGetError()错误,但永远不会检查错误代码。你应该使用类似的东西:

GLenum error = glGetError();
if (error != GL_NO_ERROR)
    std::cout << "OpenGL error: " << error << std::endl;