OpenGL не работает текстура глубины кадрового буфера

Я пытался заставить работать отображение теней, но глубина даже не записывается в текстуру. Вот мой код

//this is outside the main loop to generate the depth texture and the framebuffer
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);

GLuint depthTexture;
glGenTextures(1, &depthTexture);
glBindTexture(GL_TEXTURE_2D, depthTexture);
glTexImage2D(GL_TEXTURE_2D, 0,GL_DEPTH_COMPONENT, 1024,1024,0,GL_DEPTH_COMPONENT,GL_FLOAT,0); 0,GL_DEPTH_COMPONENT,GL_FLOAT,0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
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_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
glBindTexture(GL_TEXTURE_2D, 0);

GLuint FramebufferName ;
glGenFramebuffers(1, &FramebufferName);
glBindFramebuffer(GL_FRAMEBUFFER , FramebufferName);
glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, depthTexture, 0);
glDrawBuffer(GL_NONE);
glBindFramebuffer(GL_FRAMEBUFFER , 0);/////////////////this is inside the loop
glBindFramebuffer(GL_FRAMEBUFFER , FramebufferName);

glClearDepth(1.0f);
glClear(GL_DEPTH_BUFFER_BIT);

glViewport(0,0,1024,1024);

if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
cout<<" WARNING !! ";Matrix DephtViewMatrix = IDENTITY_MATRIX;
DephtViewMatrix = MultiplyMatrices(DephtViewMatrix , TRANSLATION_MATRIX(0,-25,0));  //my own math header
DephtViewMatrix = MultiplyMatrices(DephtViewMatrix , XROTATION_MATRIX(-1.6));
shadow.UseProgram();
shadow.CreateProjection(60,1024,1024,0.1 ,70);//also tried to change to orthographic projection , but it didn't help
shadow.setMVP(DephtViewMatrix , IDENTITY_MATRIX);

sphere.draws();
terrain.draws();
glBindFramebuffer(GL_FRAMEBUFFER ,0);

//vetrex shader
#version 330

layout(location=0) in vec3 in_Position;

uniform mat4 ViewMatrix;
uniform mat4 ProjectionMatrix;

void main(void)
{
gl_Position = ProjectionMatrix * ViewMatrix * vec4(in_Position.xyz ,1) ;

}

//fragment shader

#version 330

layout(location = 0) out float depth;

void main()
{
depth = gl_FragCoord.z;
}

Я рисую текстуру на кубе, сцена рисуется правильно, когда рисую ее цветами.

0

Решение

Можете ли вы отредактировать свой вопрос, чтобы показать шейдер, который вы используете для образец глубина текстуры?

Сразу же я заметил, что для сравнения текстур установлено GL_COMPARE_R_TO_TEXTURE; это означает, что если вы не сэмплируете текстуру используя sampler2DShadow, samplerCubeShadowи т.д., что результаты будут неопределенными. Текстуры с режимом сравнения! = GL_NONE должны быть отобраны с использованием ...Shadow сэмплер, аналогично текстурам с режимом сравнения == GL_NONE должен не быть выбран с ...Shadow пробоотборник.

И даже если вы используете соответствующий тип сэмплера для вашей текстуры глубины, если у вас включено сравнение текстур, то результатом выборки текстуры будет двоичный проход / сбой (1,0 или же 0.0) результат выполнения проверки глубины на сохраненной глубине, а не на самой глубине. Вы действительно не можете визуализировать глубину, сохраненную в карте теней, используя сравнение текстур. Но хорошая новость заключается в том, что вы можете изменять режим сравнения на лету, в зависимости от того, как вы собираетесь использовать текстуру глубины, он просто должен соответствовать вашему типу сэмплера в используемом шейдере.

Возможно, вы захотите взглянуть на этот связанный ответ что я написал, что объясняет различия между теневыми и не теневыми сэмплерами.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]