С Python и Opengl я пытаюсь реализовать глубину поля через глубину в пост -обработке через кадр -буфер.
Размытие каким -то образом работает, но главная проблема заключается в том, что когда я пытаюсь отображать только глубину (даже линеаризованную), он не рисует оттенки на объектах, то есть только черный экран.class FrameBuffer:
def __init__(self):
self.texture=0
self.dtexture=0
self.FBO=0
#genframebuffer
self.FBO=glGenFramebuffers(1)
glBindFramebuffer(GL_FRAMEBUFFER,self.FBO)
# if(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE):
# print("COMPLETED")
#textures
self.texture=glGenTextures(1)
glBindTexture(GL_TEXTURE_2D,self.texture)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, SCREEN_WIDTH, SCREEN_HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, None)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, self.texture, 0)
#depth texture
self.dtexture=glGenTextures(1)
glBindTexture(GL_TEXTURE_2D, self.dtexture)
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32F, SCREEN_WIDTH, SCREEN_HEIGHT, 0, GL_DEPTH_COMPONENT, GL_FLOAT, None)
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, self.dtexture, 0)
if glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE:
raise RuntimeError("Framebuffer incompleto!")
else:
print("Buffer Completo")
#render buffer
# self.depthStencilBuffer=glGenRenderbuffers(1)
# glBindRenderbuffer(GL_RENDERBUFFER,self.depthStencilBuffer)
# glRenderbufferStorage(GL_RENDERBUFFER,GL_DEPTH24_STENCIL8,SCREEN_WIDTH,SCREEN_HEIGHT)
# glBindRenderbuffer(GL_RENDERBUFFER,0)
# glFramebufferRenderbuffer(GL_FRAMEBUFFER,GL_DEPTH_ATTACHMENT,GL_RENDERBUFFER,self.depthStencilBuffer)
glBindFramebuffer(GL_FRAMEBUFFER,0)
def UseTexture(self,id):
glBindTexture(GL_TEXTURE_2D,id)
def destroy(self):
glDeleteTextures(self.texture)
glDeleteFramebuffers(self.FBO)
glDeleteRenderbuffers(self.depthStencilBuffer)
< /code>
рендеринг цикл: < /p>
def render(self,scene,engine):
glDepthMask(GL_TRUE)
glBindFramebuffer(GL_FRAMEBUFFER,engine.fbo.FBO)
glViewport(0, 0, SCREEN_WIDTH,SCREEN_HEIGHT)
glEnable(GL_DEPTH_TEST)
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
self.switch_render(engine.shader)
self.draw(scene, engine) # Draw scene to depth
#Post framebuffer and shader
self.switch_render(engine.postshader)
glBindFramebuffer(GL_FRAMEBUFFER, 0)
#glBlitFramebuffer(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, GL_DEPTH_BUFFER_BIT, GL_NEAREST)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glActiveTexture(GL_TEXTURE0)
glBindTexture(GL_TEXTURE_2D, engine.fbo.texture)
glUniform1i(glGetUniformLocation(engine.postshader, "screenTexture"), 0)
glActiveTexture(GL_TEXTURE1)
glBindTexture(GL_TEXTURE_2D, engine.fbo.dtexture)
glUniform1i(glGetUniformLocation(engine.postshader, "depthTexture"), 1)
# glDisable(GL_DEPTH_TEST)
# glDepthMask(GL_FALSE)
#glEnable(GL_DEPTH_TEST)
glBindVertexArray(scene.screen.vao)
glDrawArrays(GL_TRIANGLES,0,scene.screen.vertex_count)
#self.draw(scene,engine) NON DA FARE ATTENZIONE!!!
def destroy(self):
glDeleteProgram(self.shader)
< /code>
vertex shader: < /p>
#version 330 core
layout (location = 0) in vec2 vertexPos;
layout (location = 1) in vec2 vertexTexCoord;
out vec2 fragmentTexCoord;
void main()
{
fragmentTexCoord = vertexTexCoord;
gl_Position = vec4(vertexPos.xy, 0.0, 1.0);
}
< /code>
фрагментный шейдер (что -то вроде этого): < /p>
#version 330 core
out vec4 FragColor;
in vec2 fragmentTexCoord; //TexCoords
uniform sampler2D screenTexture;
uniform sampler2D depthTexture;
//const float offset = 1.0 / 300.0;
// DEPTH
float near = 0.1;
float far = 100.0;
float focusDistance=200;
int sb=0; //1 : screen 0: blurred
float LinearizeDepth(float depth)
{
float z = depth * 2.0 - 1.0; // back to NDC
return (2.0 * near * far) / (far + near - z * (far - near));
}
//
void main()
{
float depth=texture(depthTexture,fragmentTexCoord).r;
float linearDepth = LinearizeDepth(texture(depthTexture,fragmentTexCoord).r);
FragColor = vec4(vec3(depth), 1.0);
//Same thing with linearDepth
FragColor = vec4(vec3(linearDepth ), 1.0);
}
Подробнее здесь: https://stackoverflow.com/questions/795 ... creen-only
Opengl Framebuffer глубина Z-буфера, только черный или белый экран. ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
React-native-vision-camera иногда показывает черный и белый экран при открытии
Anonymous » » в форуме Android - 0 Ответы
- 24 Просмотры
-
Последнее сообщение Anonymous
-