FBO로 렌더링하려고 시도했지만 두 FBO를 화면에 렌더링하려고했지만 두 FBO 병합시 깊이 테스트를 수행하지 못했습니다. 계산 쉐이더를 사용하여 텍스처를 병합하려고했지만 깊이 텍스처의 값을 읽을 수 없습니다 (모든 값은 값 1이지만 FBO로 렌더링하면 깊이 테스트가 작동 함). 아무도 내가 뭘 잘못하고 있는지, 아니면 두 개의 FBO를 병합하는 다른 방법을 알고 있습니까? 내가 (모든 값이 어디 하나를 읽을 glBindTexture와 텍스처를 결합하는 시도OpenGL : FBO의 깊이 텍스처를 계산 쉐이더에 바인딩
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
glBindFramebuffer(GL_FRAMEBUFFER, fbo_pointcloud.fbo);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
drawPointCloud(); //Here I draw points with the depreciated fixed pipeline
glFlush();
:
struct FBO {
uint color;
uint depth;
uint fbo;
};
FBO createFBO(int width, int height) {
FBO fbo;
fbo.color = createFBOTexture(width, height, false);
fbo.depth = createFBOTexture(width, height, true);
fbo.fbo = generateFramebuffer(fbo.color, fbo.depth);
return fbo;
}
uint createFBOTexture(int width, int height, bool isDepthBuffer) {
uint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
if (isDepthBuffer)
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT16, width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
else
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_FLOAT, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
int i = glGetError();
if (i)
std::cout << "Error while creating the FBO: " << gluErrorString(i) << '\n';
return texture;
}
uint generateFrameBuffer(uint color, uint depth)
{
int mipmapLevel = 0;
//Generate FBO
uint fbo;
glGenFramebuffers(1, &fbo);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
//Attatch textures to the FBO
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color, mipmapLevel);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depth, mipmapLevel);
//Error check
int i = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (i != GL_FRAMEBUFFER_COMPLETE)
std::cout << "ERROR: frambuffer is not ok, status: " << i << '\n';
else {
int i = glGetError();
if (i)
std::cout << "Error while creating the FBO: " << gluErrorString(i) << '\n';
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
return fbo;
}
이 내가 FBO에 렌더링하는 방법입니다
이 내가 FBO를 생성하는 방법이다) :
void MergeFrames::merge(TextureLoading::FBO tex0, TextureLoading::FBO tex1, GLuint result, int width, int height)
{
glUseProgram(shader);
//Bind depth textures
glActiveTexture(GL_TEXTURE0+0);
glBindTexture(GL_TEXTURE_2D, tex0.depth);
glActiveTexture(GL_TEXTURE0+1);
glBindTexture(GL_TEXTURE_2D, tex1.depth);
//Bind color textures
glBindImageTexture(2, tex0.color, 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA8);
glBindImageTexture(3, tex1.color, 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA8);
glBindImageTexture(4, result, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA8);
//Dispatch the shader
glDispatchCompute(ceilf(width/16.0f), ceilf(height/16.0f), 1);
}
컴퓨 트 쉐이더 :
,#version 430
uniform sampler2D depthTex0;
uniform sampler2D depthTex1;
uniform layout(rgba8) readonly image2D colorTex0;
uniform layout(rgba8) readonly image2D colorTex1;
uniform layout(rgba8) writeonly image2D mergedColor;
layout (local_size_x = 16, local_size_y = 16) in;
void main() {
ivec2 ID = ivec2(gl_GlobalInvocationID.xy);
ivec2 size = imageSize(colorTex0);
vec2 texCoords = vec2(float(ID.x)/float(size.x),float(ID.y)/float(size.y));
float depths[2];
vec4 colors[2];
depths[0] = texture2D(depthTex0, texCoords).x;
depths[1] = texture2D(depthTex1, texCoords).x;
colors[0] = imageLoad(colorTex0, ID);
colors[1] = imageLoad(colorTex1, ID);
int i = int(depths[1] > depths[0]);
imageStore(mergedColor, ID, colors[i]);
}
나는 glBindTexture와 텍스처를 결합하는 시도
(모든 값이 읽을 경우 0) :
void MergeFrames::merge(TextureLoading::FBO tex0, TextureLoading::FBO tex1, GLuint result, int width, int height)
{
glUseProgram(shader);
glBindImageTexture(0, tex0.color, 0, GL_FALSE, 0, GL_READ_ONLY, GL_RGBA8);
glBindImageTexture(1, tex1.color, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA8);
glBindImageTexture(2, tex0.depth, 0, GL_FALSE, 0, GL_READ_ONLY, GL_R16);
glBindImageTexture(3, tex1.depth, 0, GL_FALSE, 0, GL_READ_ONLY, GL_R16);
glBindImageTexture(4, result, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA8);
glDispatchCompute(ceilf(width/16.0f), ceilf(height/16.0f), 1);
}
컴퓨 트 쉐이더 :
#version 430
uniform layout(rgba8) readonly image2D colorTex0;
uniform layout(rgba8) readonly image2D colorTex1;
uniform layout(r16) readonly image2D depthTex0;
uniform layout(r16) readonly image2D depthTex1;
uniform layout(rgba8) writeonly image2D mergedColor;
layout (local_size_x = 16, local_size_y = 16) in;
void main() {
ivec2 ID = ivec2(gl_GlobalInvocationID.xy);
float depths[2];
vec4 colors[2];
colors[0] = imageLoad(colorTex0, ID);
depths[0] = imageLoad(depthTex0, ID).x;
colors[1] = imageLoad(colorTex1, ID);
depths[1] = imageLoad(depthTex1, ID).x;
int i = int(depths[1] < depths[0]);
imageStore(mergedColor, ID, colors[i]);
}
내가합니다 (인덱스를 결합하는 방법이있다 인덱스는 image2D 대신에 sampler2D를 사용하는 버전과 다릅니다.) :
MergeFrames::MergeFrames()
{
shader = OpenGL::compileComputeShader("MergeFrames.comp");
glUseProgram(shader);
glUniform1i(glGetUniformLocation(shader, "colorTex0"), 0);
glUniform1i(glGetUniformLocation(shader, "colorTex1"), 1);
glUniform1i(glGetUniformLocation(shader, "depthTex0"), 2);
glUniform1i(glGetUniformLocation(shader, "depthTex1"), 3);
glUniform1i(glGetUniformLocation(shader, "mergedColor"), 4);
}
'createFBOBuffer'를 호출했지만'generateFramebuffer'에 대한 코드를 게시하십시오. 실수? – ybungalobill
예, 내 게시물의 실수입니다. 붙여 넣기 코드를 올바르게 복사하지 못한 이유를 모르겠습니다. –
셰이더에 샘플러 매개 변수에 사용할 바인딩 인덱스를 알려주는 코드가 표시되지 않습니다. 그들은'glUniform1i' 호출의 형태를 취할 것입니다. –