지연된 음영 코드를 작성하고 있습니다.
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);
}
, 왜 당신이 사용하는 사각형 텍스처 :
가로 변경하려고? 'texelFetch (...) '를 사용하여 똑같은 일을 할 수 있어야한다. –
나는 일주일 이래로이 문제를 겪고 있었고, 필자가 발견 한 지연 음영에 대한 튜토리얼을 통해 좌절감을 느꼈다. 하나는 사각형 텍스쳐를 사용했기 때문에 그것을 시도했습니다. 지금까지 texelFetch()를 사용하지 않았다면 지금 시도하고 결과를 적어 두십시오. – user2979040