2017-03-05 1 views
0

저는 씬을 텍스처로 렌더링 한 WebGL OpenGL ES 프로젝트에서 작업하고 있습니다. 그런 다음 텍스처를 사용하여 윈도우에 렌더링합니다.텍스처 좌표가 FBO 텍스처로 렌더링 될 때 약간 꺼져 있습니다.

텍스처의 가장자리가 이상하게 빛나는 것을 확인했습니다. 프로젝트를 창으로 직접 렌더링으로 되 돌리면 반짝 거리는 소리가 사라집니다.

FBO가 창과 동일한 크기로 설정되고 텍스처가 픽셀의 창 픽셀로 그려집니다.

이 문제의 원인은 무엇입니까? 고칠 수 있습니까? FB_N 텍스처에 GL_NEAREST와 다른 모든 텍스처에 GL_LINEAR을 사용하고 있습니다. GL_CLAMP_TO_EDGE를 사용하면 다른 문제가 발생할 수 있으므로 사용하지 않을 것입니다.

[render to screen] render to fbo

프레임 버퍼 작성

/* Returns true if a framebuffer object is created */ 
Display.prototype.createFramebuffer = function(name) { 
    var gl = this.gl; // Sanity Save 

    var size = 1024; 

    var fb = gl.createFramebuffer(); 
    gl.bindFramebuffer(gl.FRAMEBUFFER, fb); 
    fb.width = size; 
    fb.height = size; 

    var tex = gl.createTexture(); 
    gl.bindTexture(gl.TEXTURE_2D, tex); 
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); 
    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); 
    gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, fb.width, fb.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); 

    var rb = gl.createRenderbuffer(); 
    gl.bindRenderbuffer(gl.RENDERBUFFER, rb); 
    gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, fb.width, fb.height); 
    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0); 
    gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, rb); 

    if(gl.checkFramebufferStatus(gl.FRAMEBUFFER) !== gl.FRAMEBUFFER_COMPLETE) { return false; } 

    this.fbo[name] = {fb: fb, rb: rb, tex: tex}; 

    gl.bindTexture(gl.TEXTURE_2D, null); 
    gl.bindRenderbuffer(gl.RENDERBUFFER, null); 
    gl.bindFramebuffer(gl.FRAMEBUFFER, null); 

    return true; 
}; 

t의 오른쪽 방향으로 푸시 (그리고 충분히 후 장면

/* Draw Geometry */ 
gl.bindFramebuffer(gl.FRAMEBUFFER, this.fbo.world.fb); // Enable world framebuffer 
gl.viewport(0, 0, this.window.width, this.window.height); // Resize to canvas 
gl.clearColor(0.5, 0.5, 0.5, 1.0); // Opaque grey backdrop 
+0

FBO는 어떻게 설정합니까? 화면과 크기 및 형식이 같습니까? OpenGL 또는 OpenGL을 사용하고 있습니까? 관련 코드를 표시하십시오. – BDL

+0

@BDL 설치 코드가 추가되었습니다. 화면과 크기 및 형식이 같습니다. WebGL이 사용하는 것과 같은 OpenGL ES. –

+0

그래서 실제로 WebGL입니까? Desktop-OpenGL, OpenGL-es 및 WebGL의 세 가지 버전 모두 자체 제한 사항이 있습니다. 올바른 질문에 태그를 달면 자신의 환경에 적용되지 않는 답을 얻지 못하게됩니다. – BDL

답변

0

드로잉 전 리얼과 오류) 나는 문제를 알아 냈다.

이유는 FBO 텍스처로 렌더링 할 때 하드웨어 앤티 앨리어싱이 비활성화되어 있기 때문입니다. 그것을 고치려면 자신의 AA를 구현해야합니다.

내 프로젝트에서이 문제를 해결하기 위해 FBA 렌더링을 윈도우 해상도의 2 배까지 확대하여 조도가 거의 눈에 띄지 않는 수준으로 줄어들게하여 조잡한 MSAA 게시 쉐이더를 시도했습니다.

FXAA가 다른 좋은 해결책 일지 모르지만 나는 개인적으로 나를 위해 일할 수 없었다.

더 좋은 방법이 있다면 알려주세요.

+1

나는 그것을 다른 방법으로 말할 것이다. 문제는 안티 ​​앨리어싱에 민감하다는 것입니다. FBO에서 앤티 앨리어싱을 수행하는 방법보다는 앤티 앨리어싱을 중요하게하지 않으려 고합니다. – gman

+0

@gman 내가 읽은 것 WebGL은 FBO 텍스처로 렌더링 할 때 앤티 앨리어싱을 지원하지 않습니다. 이 정보의 출처 중 일부는 약간 오래되었습니다 (1 ~ 2 년). 반대로 견고한 참조를 찾을 수 있다면이 문제를 해결할 더 좋은 방법을 찾고 싶습니다. 나는 비효율적이기 때문에 내 자신의 AA 방법을 사용하지 않아도된다. 또한 나는 정말 도움을 주셔서 감사합니다. 나는 여기에서 자주 무시당하는 것처럼 느껴진다. –

관련 문제