2012-01-04 4 views
1

У меня есть небольшое приложение, которое я использую для тестирования, которое выполняет некоторые эффекты пост-обработки. Моя цель - прочитать пиксели, используя двойные PBO, а затем отобразить пиксели в полноэкранный квадрат текстуры и изменить/добавить мои эффекты в шейдер фрагмента. Подобно here. Приложение использует OSG, но я использую вызовы openGL для полноэкранного текстурирования.Ошибка OpenGL «недопустимое значение» при вызове glTexSubImage2D

Моя проблема заключается в том, что при копировании пикселей в текстуру каждый кадр с помощью glTexSubImage2D я получаю недопустимое значение openGL-ошибки. Я проверил с gDEBugger, что это вызов, порождающий ошибки. При первом возникновении ошибки адрес указателя отличается от всех последующих кадров. Кроме того, создавая параметры ширины и высоты glTexSubImage2d 0, ошибка не генерируется. Поэтому я не совсем уверен, что происходит.

Вот соответствующий код:

MyCallbackClass() 
{ 
    pImgData = (unsigned char*) malloc(1024*512*3); 
    setupTextureAndShaders(); 
} 
void setupTextureAndShaders() 
{ 
    glGenTextures(1, &screenTexture); 
    glBindTexture(GL_TEXTURE_2D, screenTexture); 
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 

    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

    memset(pImgData, 0, 1024*512*3); 

    glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, 1024, 512, 0, GL_RGB, GL_UNSIGNED_BYTE, pImgData); 
    glBindTexture(GL_TEXTURE_2D, 0); 
} 


//callback called every frame 
virtual void operator() (osg::RenderInfo& renderInfo) const 
{ 
    // buffer and context stuff unchanged from the sample program 

    if(!shaderInit) // only executed once 
    { 
     GLuint vs = glCreateShader(GL_VERTEX_SHADER); 
     const GLchar* vs_source = shaderLoadFile("vert.glsl"); 

     glShaderSource(vs, 1, &vs_source, NULL); 
     glCompileShader(vs); 
     checkShader(&vs); 

     GLuint fs = glCreateShader(GL_FRAGMENT_SHADER); 
     const GLchar* fs_source = shaderLoadFile("frag.glsl"); 

     glShaderSource(fs, 1, &fs_source, NULL); 
     glCompileShader(fs); 
     checkShader(&fs); 

     prog = glCreateProgram(); 

     glAttachShader(prog, vs); 
     glAttachShader(prog, fs); 

     glLinkProgram(prog); 
     texLoc = glGetUniformLocation(prog, "screenTex"); 

     shaderInit = true; 
    } 

    read(); // does the double pbo operations to read the image data into pImgData 

    glUseProgram(prog); 

    glMatrixMode(GL_PROJECTION); 
    glPushMatrix(); 
    glLoadIdentity(); 
    glMatrixMode(GL_MODELVIEW); 
    glPushMatrix(); 
    glLoadIdentity(); 

    glEnable(GL_TEXTURE_2D); 
    glBindTexture(GL_TEXTURE_2D, screenTexture); 
    glUniform1i(texLoc, 0); 
    glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1024, 512, GL_RGB, GL_UNSIGNED_BYTE, pImgData); 

    glBegin(GL_QUADS); 
     glTexCoord2f(0, 1); 
     glVertex2f(-1,-1); 
     glTexCoord2f(0, 0); 
     glVertex2f(-1,1); 
     glTexCoord2f(1,0); 
     glVertex2f(1,1); 
     glTexCoord2f(1,1); 
     glVertex2f(1,-1); 
    glEnd(); 

    glDisable(GL_TEXTURE_2D); 

    glMatrixMode (GL_MODELVIEW); 
    glPopMatrix(); 
    glMatrixMode (GL_PROJECTION); 
    glPopMatrix(); 
    glMatrixMode (GL_MODELVIEW); 


    glUseProgram(0); 

    } 
+0

Что делает функция read()? Вещи, которые генерируют указанную вами ошибку, имеют уровень mip-map, установленный ниже 0 или выше max, который у вас нет, или имеющий ширину и/или высоту отрицательные или вне границы изображения, в вашем случае. Так что, возможно, ваши операции pbo установили состояние в нечто иное, чем вы ожидаете? (Кстати, вы, вероятно, должны перейти от PBO к FBO в будущем, поскольку PBOs устарели.) – user1118321

+0

PBO не устарели и все еще присутствуют в последних спецификациях OpenGL 4.x – GameDeveloper

+0

ничего из ядра 3.3 не устарело – GameDeveloper

ответ

1

Я посмотрел в состояние изменяющегося в чтении() вызов, однако реальная проблема была с моей setupTexturesAndShaders функции(), находящихся в другом контексте. Я считаю, что это привело к тому, что glTexSubImage2D был вызван, не вызвав сначала glTexImage2D в том же контексте, который сделал бы любое изображение размера вне диапазона. Спасибо, что задумался на правильном пути

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