У меня есть небольшое приложение, которое я использую для тестирования, которое выполняет некоторые эффекты постобработки. Моя цель - прочитать пиксели, используя двойные PBO, а затем отобразить пиксели в полноэкранном квадрате текстур и изменить / добавить мои эффекты в фрагментном шейдере. Похоже на здесь . Приложение использует OSG, но я использую вызовы openGL для полноэкранного текстурирования.
Моя проблема в том, что когда я копирую пиксели в текстуру каждого кадра с помощью glTexSubImage2D, я получаю недопустимое значение openGL error Я проверил с помощью 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);
}