2012-01-04 2 views
1

일부 포스트 프로세싱 효과를 테스트하는 데 사용하는 작은 응용 프로그램이 있습니다. 내 목표는 이중 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); 

    } 
+0

read() 함수의 기능은 무엇입니까? 목록에있는 오류를 생성하는 것들은 밉맵 레벨이 0 이하이거나 최대 값보다 높거나 낮거나 또는 너비 및/또는 높이가 음수이거나 이미지 경계 밖에서 설정되어 있습니다. 너의 경우에있어. 어쩌면 당신의 PBO 운영이 당신이 기대하는 것과 다른 상태로 설정했을 수도 있습니다. PBO는 더 이상 사용되지 않으므로 PBO는 향후 PBO에서 FBO로 전환해야합니다. – user1118321

+0

PBO는 더 이상 사용되지 않으며 최신 OpenGL 4.x 사양에 계속 제공됩니다. – GameDeveloper

+0

3.3의 핵심 부분은 더 이상 사용되지 않습니다. – GameDeveloper

답변

1

내가 (읽기에 변화 상태로 보았다) 전화 :

여기에 관련 코드입니다. 나는 glTexSubImage2D가 glTexImage2D를 처음에 같은 컨텍스트에서 호출하지 않고 호출 되었기 때문에 어떤 크기의 이미지도 범위를 벗어난 것이라고 생각합니다. 올바른 트랙을 생각해 주셔서 감사합니다.