2013-04-12 5 views
0

Существует простая программа, которая на самом деле является более крупной, отложив это в сторону, я попытался сделать простой пиксел для чтения/записи в Opengl.
Первый раздел, который включает в себя считывание цвета пикселя, но второй, который включает в себя запись пикселя, а затем чтение его сбой !. Вот программа, которая демонстрирует проблему:glReadPixels Читает неправильный цвет в opengl

#include <iostream> 
#include <glut.h> 

using namespace std; 


void init(void) 
{ 
    glClearColor(1.0,0.0,0.0,0.0); 
    glMatrixMode(GL_PROJECTION); 
    gluOrtho2D(0.0,100.0,0.0,100.0); 
} 


void displayfnc() 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 


    unsigned char current[3]; 
    int r,g,b; 
    //x=0 to 6 is right 
    glBegin (GL_POINTS); 
    glColor3f (0.0,0.0,1.0); 
    glVertex2i (6,0); 
    glEnd(); 

    //works well. 
    glReadPixels(6,0, 1, 1 , GL_RGB , GL_UNSIGNED_BYTE ,current); 
    r = current[0]; 
    g = current[1]; 
    b = current[2]; 
    cout<<"read from x=6::::"<<"r:"<<r<<"g:"<<g<<"b:"<<b<<endl; 

    //x =7 and other isnt right 
    glBegin (GL_POINTS); 
    glColor3f (0.0,0.0,1.0); 
    glVertex2i (7,0); 
    glEnd(); 
    //the problem is here in the reading.why this happen? 
    glReadPixels(7,0, 1, 1 , GL_RGB , GL_UNSIGNED_BYTE ,current); 
    r = current[0]; 
    g = current[1]; 
    b = current[2]; 
    cout<<"Read from x=7::::"<<"r:"<<r<<"g:"<<g<<"b:"<<b<<endl; 

    glFlush(); 
} 

int main(int argc, char** argv) 
{ 

    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); 
    glutInitWindowSize(100,100); 
    glutInitWindowPosition(0, 0); 
    glutCreateWindow("BoundaryFill"); 
    init(); 
    glutDisplayFunc(displayfnc); 
    glutMainLoop(); 
    return 0; 
} 

Вот результат:

Programs output

Что является причиной второй процедуры чтения на провал?

+1

Оклейка консольный вывод будет полезно, как хорошо я думаю. – alexrider

+0

@Alexrider: его сделано. – Breeze

+0

Что делать, если вы проверяете значения RGB _after_ 'glFlush()'? – user1095108

ответ

0

Как минимум в моей системе glutInitWindowSize(100,100) - всего лишь предложение. glutGet(GLUT_WINDOW_WIDTH) фактически возвращается 104, нет 100 как ваш gluOrtho2D() call принимаем.

Попробуйте использовать динамическую проекцию вместо:

#include <GL/glut.h> 
#include <iostream> 

using namespace std; 

void displayfnc() 
{ 
    glClearColor(1.0,0.0,0.0,0.0); 
    glClear(GL_COLOR_BUFFER_BIT); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    double w = glutGet(GLUT_WINDOW_WIDTH); 
    double h = glutGet(GLUT_WINDOW_HEIGHT); 
    gluOrtho2D(0.0,w,0.0,h); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    unsigned char current[3]; 
    int r,g,b; 
    //x=0 to 6 is right 
    glBegin (GL_POINTS); 
    glColor3f (0.0,0.0,1.0); 
    glVertex2i (6,0); 
    glEnd(); 

    //works well. 
    glReadPixels(6,0, 1, 1 , GL_RGB , GL_UNSIGNED_BYTE ,current); 
    r = current[0]; 
    g = current[1]; 
    b = current[2]; 
    cout<<"read from x=6::::"<<"r:"<<r<<"g:"<<g<<"b:"<<b<<endl; 

    //x =7 and other isnt right 
    glBegin (GL_POINTS); 
    glColor3f (0.0,0.0,1.0); 
    glVertex2i (7,0); 
    glEnd(); 
    //the problem is here in the reading.why this happen? 
    glReadPixels(7,0, 1, 1 , GL_RGB , GL_UNSIGNED_BYTE ,current); 
    r = current[0]; 
    g = current[1]; 
    b = current[2]; 
    cout<<"Read from x=7::::"<<"r:"<<r<<"g:"<<g<<"b:"<<b<<endl; 

    glFlush(); 
} 

int main(int argc, char** argv) 
{ 

    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); 
    glutInitWindowSize(100,100); 
    glutInitWindowPosition(0, 0); 
    glutCreateWindow("BoundaryFill"); 
    glutDisplayFunc(displayfnc); 
    glutMainLoop(); 
    return 0; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^