2014-09-23 4 views
0

지연된 음영 코드를 작성하고 있습니다.
FBO에는 4 가지 색상의 첨부 파일 (텍스처)과 깊이 첨부 파일 (렌더 버퍼)이 있습니다.
쉐이더로 내 장면을 렌더링합니다.이 쉐이더는이 4 가지 색상의 첨부 파일에 씁니다.
문제는 0 번 색상 첨부 데이터가 다른 데이터에도 기록된다는 것입니다. GLSL MRT는 모든 데이터 첨부물에 동일한 데이터를 씁니다.

Renderer_Deferred.java 
    public class Renderer_Deferred 
    { 
     private final int FBO; 
     private final int depthbuffer; 
     public final int positiontexture, diffusetexture, normaltexture, bumpmap; 

    Renderer_Deferred() 
    { 
     System.out.println("Setting up the deferrer.."); 
     positiontexture = GL11.glGenTextures(); 
     diffusetexture = GL11.glGenTextures(); 
     normaltexture = GL11.glGenTextures(); 
     bumpmap = GL11.glGenTextures(); 
     FBO = glGenFramebuffers(); 
     glBindFramebuffer(GL_FRAMEBUFFER, FBO); 

     GL11.glBindTexture(ARBTextureRectangle.GL_TEXTURE_RECTANGLE_ARB, positiontexture); 
     GL11.glTexParameterf(ARBTextureRectangle.GL_TEXTURE_RECTANGLE_ARB, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); 
     GL11.glTexParameterf(ARBTextureRectangle.GL_TEXTURE_RECTANGLE_ARB, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); 
     GL11.glTexImage2D(ARBTextureRectangle.GL_TEXTURE_RECTANGLE_ARB, 0, GL30.GL_RGB32F, Configuration.displayWidth, Configuration.displayheight, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (java.nio.ByteBuffer) null); 
     GL11.glBindTexture(ARBTextureRectangle.GL_TEXTURE_RECTANGLE_ARB, 0); 

     GL11.glBindTexture(ARBTextureRectangle.GL_TEXTURE_RECTANGLE_ARB, diffusetexture); 
     GL11.glTexParameterf(ARBTextureRectangle.GL_TEXTURE_RECTANGLE_ARB, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); 
     GL11.glTexParameterf(ARBTextureRectangle.GL_TEXTURE_RECTANGLE_ARB, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); 
     GL11.glTexImage2D(ARBTextureRectangle.GL_TEXTURE_RECTANGLE_ARB, 0, GL11.GL_RGBA, Configuration.displayWidth, Configuration.displayheight, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (java.nio.ByteBuffer) null); 
     GL11.glBindTexture(ARBTextureRectangle.GL_TEXTURE_RECTANGLE_ARB, 0); 

     GL11.glBindTexture(ARBTextureRectangle.GL_TEXTURE_RECTANGLE_ARB, normaltexture); 
     GL11.glTexParameterf(ARBTextureRectangle.GL_TEXTURE_RECTANGLE_ARB, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); 
     GL11.glTexParameterf(ARBTextureRectangle.GL_TEXTURE_RECTANGLE_ARB, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); 
     GL11.glTexImage2D(ARBTextureRectangle.GL_TEXTURE_RECTANGLE_ARB, 0, GL30.GL_RGB16F, Configuration.displayWidth, Configuration.displayheight, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (java.nio.ByteBuffer) null); 
     GL11.glBindTexture(ARBTextureRectangle.GL_TEXTURE_RECTANGLE_ARB, 0); 

     GL11.glBindTexture(ARBTextureRectangle.GL_TEXTURE_RECTANGLE_ARB, bumpmap); 
     GL11.glTexParameterf(ARBTextureRectangle.GL_TEXTURE_RECTANGLE_ARB, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); 
     GL11.glTexParameterf(ARBTextureRectangle.GL_TEXTURE_RECTANGLE_ARB, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST); 
     GL11.glTexImage2D(ARBTextureRectangle.GL_TEXTURE_RECTANGLE_ARB, 0, GL11.GL_RGBA, Configuration.displayWidth, Configuration.displayheight, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, (java.nio.ByteBuffer) null); 
     GL11.glBindTexture(ARBTextureRectangle.GL_TEXTURE_RECTANGLE_ARB, 0); 

     GL11.glViewport(0, 0, Configuration.displayWidth, Configuration.displayheight); 

     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, ARBTextureRectangle.GL_TEXTURE_RECTANGLE_ARB, positiontexture, 0); 
     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, ARBTextureRectangle.GL_TEXTURE_RECTANGLE_ARB, diffusetexture, 0); 
     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, ARBTextureRectangle.GL_TEXTURE_RECTANGLE_ARB, normaltexture, 0); 
     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT3, ARBTextureRectangle.GL_TEXTURE_RECTANGLE_ARB, bumpmap, 0); 

     depthbuffer = glGenRenderbuffers(); 
     glBindRenderbuffer(GL_RENDERBUFFER, depthbuffer); 
     glRenderbufferStorage(GL_RENDERBUFFER, GL14.GL_DEPTH_COMPONENT24, Configuration.displayWidth, Configuration.displayheight); 
     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthbuffer); 
     glBindRenderbuffer(GL_RENDERBUFFER, 0); 

     if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) 
     { 
      System.err.println("Generating the deferred FBO failed!"); 
      System.exit(5321); 
     } 

     glBindFramebuffer(GL_FRAMEBUFFER, 0); //////////////////////////////////////////////////////// 
    } 

    public void startRendering() 
    { 
     // CLEAR AND HOOK UP TEXTURES 
     glBindFramebuffer(GL_FRAMEBUFFER, FBO); 

     IntBuffer buf = BufferUtils.createIntBuffer(4); 
     buf.put(GL_COLOR_ATTACHMENT0); 
     buf.put(GL_COLOR_ATTACHMENT1); 
     buf.put(GL_COLOR_ATTACHMENT2); 
     buf.put(GL_COLOR_ATTACHMENT3); 
     buf.flip(); 

     GL20.glDrawBuffers(buf); 

     if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) 
     { 
      System.err.println("Deferred renderer failed to setup correctly!"); 
     } 

     GL11.glEnable(GL11.GL_DEPTH_TEST); 
     GL11.glDepthFunc(GL11.GL_LEQUAL); 
     GL11.glViewport(0, 0, Configuration.displayWidth, Configuration.displayheight); 
     GL11.glClearColor(SimpleCraft.world.skycolor.x, SimpleCraft.world.skycolor.y, SimpleCraft.world.skycolor.z, 0f); 
     GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); 
    } 

    public void stopRendering() 
    { 
     glBindFramebuffer(GL_FRAMEBUFFER, 0); 
    } 
} 

위의 활성화 및 지연 렌더링을 비활성화 내 코드입니다 :

다음은 내 코드입니다. 이 후 완료, 포스트 프로세서는 활성화 : 아래

public class Renderer_Postprocessor 
{ 
    PostprocessingObject postprocessor; 

    public static int loc_pos, loc_diffuse, loc_normal, loc_bump, loc_ambient; 
    public static int loc_viewingdistance, loc_modelviewmatrix; 

    Renderer_Postprocessor() 
    { 
     postprocessor = new PostprocessingObject(); 
    } 

    public void postprocess(int pos, int diffuse, int normal, int bump) 
    { 
     GL11.glClear(GL11.GL_COLOR_BUFFER_BIT); 
     GL11.glDisable(GL11.GL_DEPTH_TEST); 
     GL20.glUseProgram(Shaders.PROGRAM_POSTPROCESSOR); 
     GL20.glDrawBuffers(GL11.GL_BACK); 

     GL13.glActiveTexture(GL13.GL_TEXTURE0); 
     GL11.glBindTexture(ARBTextureRectangle.GL_TEXTURE_RECTANGLE_ARB, pos); 
     GL13.glActiveTexture(GL13.GL_TEXTURE1); 
     GL11.glBindTexture(ARBTextureRectangle.GL_TEXTURE_RECTANGLE_ARB, diffuse); 
     GL13.glActiveTexture(GL13.GL_TEXTURE2); 
     GL11.glBindTexture(ARBTextureRectangle.GL_TEXTURE_RECTANGLE_ARB, normal); 
     GL13.glActiveTexture(GL13.GL_TEXTURE3); 
     GL11.glBindTexture(ARBTextureRectangle.GL_TEXTURE_RECTANGLE_ARB, bump); 

     GLUtility.uploadToShader(Configuration.viewDistanceInBlocks, loc_viewingdistance); 
     GLUtility.uploadToShader(Camera.getModelViewMatrix(new Matrix4f(), Camera.getViewMatrix()), loc_modelviewmatrix); 

     GL30.glBindVertexArray(postprocessor.getVAO()); 
     GL11.glDrawArrays(GL11.GL_TRIANGLES, 0, 6); 
     GL30.glBindVertexArray(0); 
     GL20.glUseProgram(0); 

     GL13.glActiveTexture(GL13.GL_TEXTURE0); 
     GL11.glBindTexture(ARBTextureRectangle.GL_TEXTURE_RECTANGLE_ARB, 0); 
     GL13.glActiveTexture(GL13.GL_TEXTURE1); 
     GL11.glBindTexture(ARBTextureRectangle.GL_TEXTURE_RECTANGLE_ARB, 0); 
     GL13.glActiveTexture(GL13.GL_TEXTURE2); 
     GL11.glBindTexture(ARBTextureRectangle.GL_TEXTURE_RECTANGLE_ARB, 0); 
     GL13.glActiveTexture(GL13.GL_TEXTURE3); 
     GL11.glBindTexture(ARBTextureRectangle.GL_TEXTURE_RECTANGLE_ARB, 0); 
     GL11.glEnable(GL11.GL_DEPTH_TEST); 
    } 
} 

은 deferrer 및 포스트 프로세서 내 조각 쉐이더 있습니다

Deferred_Fragment.frag 
#version 330 core 
#extension GL_ARB_explicit_uniform_location : require 
layout(location=0) uniform sampler2DArray texture_diffuse; 
layout(location=1) uniform sampler2DArray texture_normal; 

uniform vec3 pass_EyeVector; 

in vec4 pass_Position; 
in vec3 pass_TextureCoord; 
in vec3 pass_Normal; 

layout(location = 0) out vec4 pos; 
layout(location = 1) out vec4 dif; 
layout(location = 2) out vec4 nor; 
layout(location = 3) out vec4 bum; 

void main(void) 
{ 
    pos = texture(texture_diffuse, pass_TextureCoord); // Transform from -1/1 to 0/1 
    dif = pass_Position; 
    nor = vec4(pass_Normal, 1.0); 
    bum = texture(texture_normal, pass_TextureCoord); 
} 

그리고 postprocessor.frag

#version 330 core 
#extension GL_ARB_explicit_uniform_location : require 

layout(location=0) uniform sampler2DRect positiontexture; 
layout(location=1) uniform sampler2DRect diffusetexture; 
layout(location=2) uniform sampler2DRect normaltexture; 
layout(location=3) uniform sampler2DRect bumpmap; 

in vec2 pass_TextureCoord; 
out vec4 out_Color; 

void main(void) 
{ 
    out_Color = texture(diffusetexture, pass_TextureCoord); 
} 
+0

, 왜 당신이 사용하는 사각형 텍스처 :

가로 변경하려고? 'texelFetch (...) '를 사용하여 똑같은 일을 할 수 있어야한다. –

+0

나는 일주일 이래로이 문제를 겪고 있었고, 필자가 발견 한 지연 음영에 대한 튜토리얼을 통해 좌절감을 느꼈다. 하나는 사각형 텍스쳐를 사용했기 때문에 그것을 시도했습니다. 지금까지 texelFetch()를 사용하지 않았다면 지금 시도하고 결과를 적어 두십시오. – user2979040

답변

1

당신에게 ' uniform 변수에 location 레이아웃 한정자를 사용하려고합니다.

layout(location=0) uniform sampler2DArray texture_diffuse; 
layout(location=1) uniform sampler2DArray texture_normal; 

layout(location=0) uniform sampler2DRect positiontexture; 
layout(location=1) uniform sampler2DRect diffusetexture; 
layout(location=2) uniform sampler2DRect normaltexture; 
layout(location=3) uniform sampler2DRect bumpmap; 

GLSL 사양에서 지원되지 않는다는 것을 찾을 수 없었습니다. 330 이상에서는 버텍스 쉐이더 입력과 프래그먼트 쉐이더 출력 만이 location을 지원하도록 나열됩니다. 최신 버전에서는 다른 셰이더 스테이지의 변수도 in/out으로 지원되는 것으로 보이지만, 유니폼에 대해서는 언급하지 않았습니다.

아마도이 한정자로 샘플러의 텍스처 단위를 설정하려고했을 것입니다. 이 내용은 나중에하지만 OpenGL을 4.2 (GLSL 버전 420) 및 지원됩니다

layout(binding=0) uniform sampler2DArray texture_diffuse; 
layout(binding=1) uniform sampler2DArray texture_normal; 

:이처럼 보이는 binding 한정자가있다. GLSL 330을 고수하고 싶다면 glGetUniformLocaction()glUniform1i()을 사용하여 예전 방식으로 샘플러 유니폼의 텍스처 단위를 설정해야합니다.

+0

답변 해 주셔서 감사합니다! 유니폼의 레이아웃 (위치)이 확장에 의해 활성화되었습니다. 구식 방식으로 텍스처를 업로드하고 결과를 게시하려고 시도합니다. 필자가 확실히 알아 낸 점은 지연된 렌더러에서 오류가 발생할 가능성이 가장 높다는 것입니다. 프리로드 된 텍스처로 포스트 프로세서를 시도해 보았지만 정상적으로 작동했습니다. – user2979040

+0

아, 그래, 내가 쉐이더 코드에서 보았어 야했다. 이름에서 알 수 있듯이 유니폼 위치를 정의합니다. 그래서'glGetUniformLocation()'호출을 불필요하게 만들지 만 여전히'glUniform1i()'를 호출하여 값을 설정해야합니까? –

+0

가능성이 큽니다. 모든 레이아웃 (위치)을 삭제하고 구식으로 돌아갔습니다. 모든 것이 이제는 정상적으로 작동하고 있지만, 나는 내 잘못을 정말로 이해하지 못했습니다. 도와 주셔서 감사합니다! – user2979040

0

샘플러 바인딩을 위해 레이아웃 위치 대신 레이아웃 바인딩을 사용해야합니다. 같은 위치에 여러 개의 샘플러가 묶여 있기 때문에 바인딩 포인트를 다시 확인해야합니다. 텍스처를 TEXTURE0에 바인딩하는 경우 binding = 0으로 지정하십시오. GL 3.3

호기심에서
layout(binding=0) uniform sampler2DArray texture_diffuse; 
layout(binding=1) uniform sampler2DArray texture_normal; 

layout(binding=0) uniform sampler2DRect positiontexture; 
layout(binding=1) uniform sampler2DRect diffusetexture; 
layout(binding=2) uniform sampler2DRect normaltexture; 
layout(binding=3) uniform sampler2DRect bumpmap; 
관련 문제