ShadowMap путают

Я смущен теневым отображением. Вот то, что я понял (после шагов, не работают:))

Как получить прибыль (пожалуйста, не запутывайтесь о коде, это примерно, потому что я пишу на Яве):

1. Create empty depthTexture (mine is 1024x1024) with parameters

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE) and

glTexImage2D (GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, ширина, высота, 0, GL_DEPTH_COMPONENT, GL_FLOAT, GL_NULL)

2. Create FBO and attach that texture to it

glFramebufferTexture (GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, depthTexture, 0)

3. Setup new projection and view matrix for lighting camera

Я использовал то же самое в качестве своей главной камеры только с другим, связывает, потому что сцена выглядит лучше в нем (я испытал его, таким образом, нет никакой проблемы... , я предполагаю ..).

4. Create new little shader to determinate gl_Position for FBO and modify the main shader with fancy stuff (bias matrix * lightCamera matrix * vertex, sampler2Dshadow and more)

5. Of course uniform everything and do something.

And now RENDER LOOP

1. Of course uniform everything and do something(again).

2. Bind FBO, bind little shader, glViewport(0, 0, 1024, 1024), colorMask to false, clear depth buffer, glCullFace(GL_FRONT), glBindTexture(GL_TEXTURE_2D, 0)

3. Render everything using only vertex position attribs completely for nothing

4. Unbind FBO, rebind program to main shader (that one with fancy stuff), glViewport, enable colorMask, glCullFace(GL_BACK)

5. Render the scene normally without even thinking about "How the hell main shader gonna get sampler2DShadow because we dont bind it, dont uniform it, and don't even touch it"

6. Watch countless glitches, bugs and pixel orgy

На самом деле я попробовал к униформе depthTexture к образцу, но у меня есть черный экран только. И даже если я не отдаю FBO, я получаю ту же самую картину, когда я делаю это.

Кто-то может объяснить, что я пропускаю?

Я чувствую себя подобно использованию шейдера разбросанная структура дважды: как разбросанная структура и как depthTexture, но я не знаю, как дать его это depthTexture.

2
nl ja de

1 ответы

here is a good link to read: http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-16-shadow-mapping/

и здесь: http://www.paulsprojects.net/tutorials/smt/smt.html (хотя вторая связь использует старую стандартную функцию opengl),

в целом:

  1. создает одну структуру глубины
  2. прилагает эту структуру к FBO
  3. связывает FBO, установку надлежащий viewport
  4. отдает сцену из света на месте продажи, экономит только значения глубины к вашей структуре
  5. развязывает FBO и сцену финала установки vieport и положение камеры
  6. , обычно отдает сцену используя теневой тест (sampler2DShadow)

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

Я не знаю, почему вы отдаете вам сцену обычно дважды..., вы используете Z-предварительный-проход или что-то? просто попробуйте базовую версию, я думаю.

мой старый код со схемами затенения:

void RenderShadowMap() {
    currDepth->Bind();
    glClear(GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gLightCam.SetProjectionMatrix();
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gLightCam.SetViewMatrix();

    glColorMask(false, false, false, false);
    glUseProgram(0);  //draw without any shaders... just default depth
    glEnable(GL_POLYGON_OFFSET_FILL);
    glPolygonOffset(offFactor, offUnits);
    SimpleScene(false);//floor does not cast shadow so do not render it
    glDisable(GL_POLYGON_OFFSET_FILL);
    glColorMask(true, true, true, true);
}

отдайте сцену:

// compose shadow matrix:
MATRIX4X4 bias(0.5f, 0.0f, 0.0f, 0.0f, 
               0.0f, 0.5f, 0.0f, 0.0f,
               0.0f, 0.0f, 0.5f, 0.0f,
               0.5f, 0.5f, 0.5f, 1.0f);
MATRIX4X4 *invCam = gSphericalCam.GetInvViewMatrix();
MATRIX4X4 smMat = (*gLightCam.GetViewProjMatrix()) * (*invCam);

gShaderProgramManager->GetProgram("shadow")->Use();
gShaderProgramManager->GetProgram("shadow")->SetMatrix("shadowMat", &smMat);
gShaderProgramManager->GetProgram("shadow")->SetBool("useShadow", currCam != &gLightCam && useShadow);
gShaderProgramManager->GetProgram("shadow")->SetFloat("shadowMapSize", (float)currDepth->GetWidth());
glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
glColor3f(1.0f, 1.0f, 1.0f);
gTextureManager->Bind("default");
glActiveTexture(GL_TEXTURE1);
currDepth->BindDepthAsTexture();
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE_ARB);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LEQUAL);

SimpleScene();
4
добавлено
большой я мог помочь:), пожалуйста, upvote мой ответ, если вы можете:)
добавлено автор fen, источник
Я don' t отдают мою сцену обычно дважды:). Во-первых, я отдаю его к FBO, чтобы заполнить структуру глубины, используя только вершину положения XYZ (так в основном, это - "Z-предварительный-проход"), и только тогда я обычно отдаю его. Так или иначе, никакая обучающая программа don' t говорят что-либо о glActiveTexture , который, кажется, ответственен, посылая различные структуры в той же самой программе шейдера. I' ve setted моя структура глубины как GL_TEXTURE1 , и я связываю его, когда я отдаю свой FBO, и Это работает! Большое спасибо за ваш код!
добавлено автор TomatoMato, источник
Жаль я don' у t есть достаточно репутации: (
добавлено автор TomatoMato, источник
У меня есть upvoted!, это большой код!
добавлено автор Bình Nguyên, источник
pro.graphon (and gamedev)
pro.graphon (and gamedev)
389 участник(ов)

Обсуждаем стандарты консорциума Khronos: OpenGL, OpenCL и пр., предлагаем различные работы, туторы, интересные материалы по этим стандартам (и помечаем их тегами). Правила чата и инфо по системе тегов – /rules. Реклама только по согласованию с @AlexFails.