Я пытался заставить теневое отображение работать, но глубина даже не написана текстуре. Вот мой код.
//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;
}
Я рисую текстуру на кубе, сцена рисует правильно, рисуя ее цветами.
Не могли бы вы изменить свой вопрос, чтобы показать шейдер, который вы используете, чтобы пробовать текстуру глубины?
Сразу же, я заметил, что у вас есть сравнение текстур с GL_COMPARE_R_TO_TEXTURE
; это означает, что, если вы не sampler2DShadow
текстуру с помощью sampler2DShadow
, samplerCubeShadow
и т.д., чтобы результаты не были определены. Текстуры со сравнительным режимом! = GL_NONE
должны быть сэмплированы с использованием ...Shadow
sampler, аналогично текстурам со сравнительным режимом == GL_NONE
не следует отбирать с помощью ...Shadow
sampler.
И даже если для текстуры глубины вы используете соответствующий тип сэмплера, если у вас есть сопоставление текстур, результатом выборки текстуры будет результат двоичного прохода/отказа (1,0 или 0,0) для выполнения теста глубины на сохраненной глубина, а не сама глубина. Вы действительно не можете визуализировать глубину, хранящуюся в теневой карте, используя сравнение текстур. Но хорошей новостью является то, что вы можете изменить режим сравнения "на лету" в зависимости от того, как вы собираетесь использовать текстуру глубины, она просто должна соответствовать типу вашего сэмплера в шейдере, который вы используете.
Вы можете взглянуть на этот связанный ответ, который я написал, что объясняет различия между теневыми и не теневыми пробоотборниками.