일부 포스트 프로세싱 효과를 테스트하는 데 사용하는 작은 응용 프로그램이 있습니다. 내 목표는 이중 PBO를 사용하여 픽셀을 읽은 다음 픽셀을 전체 화면 텍스처 쿼드로 렌더링하고 조각 쉐이더에서 내 효과를 수정/추가하는 것입니다. here와 유사합니다. 응용 프로그램에서 OSG를 사용하지만 OpenGL 호출을 사용하여 전체 화면 텍스처링을 수행합니다.glTexSubImage2D 호출시 OpenGL 오류 '잘못된 값'
내 문제는 glTexSubImage2D를 사용하여 각 프레임의 텍스처에 픽셀을 복사 할 때 유효하지 않은 값의 OpenGL 오류가 발생한다는 것입니다. gDEBugger를 통해 오류를 생성하는 호출임을 확인했습니다. 처음 오류가 발생하면 포인터 주소가 모든 후속 프레임과 다릅니다. 또한 glTexSubImage2d의 width 및 height 매개 변수를 0으로 설정하면 오류가 생성되지 않습니다. 그래서 나는 정말로 어떤 일이 일어날 지 잘 모릅니다. 그러나 진짜 문제는 내 setupTexturesAndShaders() 함수를 다른 컨텍스트에있는과 함께 계셨으니이
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);
}
read() 함수의 기능은 무엇입니까? 목록에있는 오류를 생성하는 것들은 밉맵 레벨이 0 이하이거나 최대 값보다 높거나 낮거나 또는 너비 및/또는 높이가 음수이거나 이미지 경계 밖에서 설정되어 있습니다. 너의 경우에있어. 어쩌면 당신의 PBO 운영이 당신이 기대하는 것과 다른 상태로 설정했을 수도 있습니다. PBO는 더 이상 사용되지 않으므로 PBO는 향후 PBO에서 FBO로 전환해야합니다. – user1118321
PBO는 더 이상 사용되지 않으며 최신 OpenGL 4.x 사양에 계속 제공됩니다. – GameDeveloper
3.3의 핵심 부분은 더 이상 사용되지 않습니다. – GameDeveloper