0

ディファード ライトニングを実装するために、光源を光の半径を持つ球体としてレンダリングします。

実際の光の位置だけを画面にレンダリングしました。結果は以下です。 ここに画像の説明を入力

この球体の交差をレンダリングできれば、ディファード シェーダーの各ライトの for ループを取り除くことができるのではないかと考えました。

リンクの次のドキュメントを使用してhttps://kayru.org/articles/deferred-stencil/ 光球と実際のシーンの交差を実装し、以下のテクスチャに保存しました。

ここに画像の説明を入力

問題は、結果が予想とは少し異なることです。交差には他の球体も含まれます。ライト ボリュームは互いに交差してはなりません。適切な交差メソッドを実装するにはどうすればよいですか?

    int k = 0;
    for(GLXlight & glxlightdata : entitySystem->glxlights){
        lBufferShader->uniform4f(lBufferShader->lightPos[k], &glxlightdata.lightPos[0]);
        k++;
    }
    lBufferShader->uniformMatrix4(lBufferShader->ViewMatrix, &entitySystem->view[0][0]); //ViewMatrix
    lBufferShader->uniform3f(lBufferShader->viewPos, &(*entitySystem->viewpos)[0]); //viewPos
    lBufferShader->uniformMatrix4(lBufferShader->ProjectionMatrix, &entitySystem->projection[0][0]); //ProjectionMatrix
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, lightObject->glxobject.elementBufferID);
        glCullFace(GL_BACK);                                    //Front (near) faces only
        glColorMask(GL_FALSE , GL_FALSE , GL_FALSE , GL_FALSE); //Colour write is disabled
        glDepthMask(GL_FALSE);                                  //Z-write is disabled
        glDepthFunc(GL_LEQUAL);                                 //Z function is 'Less/Equal'//
        glStencilFunc(GL_ALWAYS, 0, 0x00);                      //Stencil test result does not modify Stencil buffer
        glStencilMask(0xFF);
        glStencilOp(GL_KEEP, GL_INCR, GL_KEEP);                 //Z-Fail writes non-zero value to Stencil buffer 
    glDrawElementsInstanced(GL_TRIANGLES, lightObject->glxobject.size, GL_UNSIGNED_SHORT, (void *) 0, lightObject->glxinstances.size());
        glCullFace(GL_FRONT);                                   //Back (far) faces only
        glColorMask(GL_TRUE , GL_TRUE , GL_TRUE , GL_TRUE);     //Colour write is enabled
        glDepthMask(GL_FALSE);                                  //Z-write is disabled
        glDepthFunc(GL_GEQUAL);                                 //Z function is 'Greater/Equal'
        glStencilFunc(GL_EQUAL, 0, 0xFF);                       //Stencil test result does not modify Stencil buffer
        glStencilMask(0xFF);
        glStencilOp(GL_ZERO, GL_KEEP, GL_KEEP);                 //Z-Fail writes non-zero value to Stencil buffer 
    glDrawElementsInstanced(GL_TRIANGLES, lightObject->glxobject.size, GL_UNSIGNED_SHORT, (void *) 0, lightObject->glxinstances.size());
4

1 に答える 1