1

ポイント ライトのシャドウ マッピングをサポートするには、深度値をキューブマップの 6 つの側面にレンダリングする必要があります。

私のinit関数は次のようになります:

public void init(int width, int height) {
    fboId = GL30.glGenFramebuffers();

    GL11.glEnable(GL13.GL_TEXTURE_CUBE_MAP);
    cubeMap = GL11.glGenTextures();

    GL11.glBindTexture(GL13.GL_TEXTURE_CUBE_MAP, cubeMap);

    GL11.glTexParameteri(GL13.GL_TEXTURE_CUBE_MAP,
            GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
    GL11.glTexParameteri(GL13.GL_TEXTURE_CUBE_MAP,
            GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
    GL11.glTexParameteri(GL13.GL_TEXTURE_CUBE_MAP, GL11.GL_TEXTURE_WRAP_S,
            GL11.GL_CLAMP);
    GL11.glTexParameteri(GL13.GL_TEXTURE_CUBE_MAP, GL11.GL_TEXTURE_WRAP_T,
            GL11.GL_CLAMP);
    GL11.glTexParameteri(GL13.GL_TEXTURE_CUBE_MAP, GL12.GL_TEXTURE_WRAP_R,
            GL11.GL_CLAMP);

    for (int i = 0; i < 6; i++)
        GL11.glTexImage2D(GL13.GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0,
                GL14.GL_DEPTH_COMPONENT32, width, height, 0,
                GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, (FloatBuffer) null);

    GL11.glBindTexture(GL13.GL_TEXTURE_CUBE_MAP, 0);
}

これは、キューブ マップの側面を FBO にバインドするために使用する関数です。

public void bindForWriting(int target) {
    // target is GL13.GL_TEXTURE_CUBE_MAP_POSITIVE_X etc.

    GL30.glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, fboId);
    GL30.glFramebufferTexture2D(GL30.GL_DRAW_FRAMEBUFFER,
            GL30.GL_DEPTH_ATTACHMENT, target, cubeMap, 0);

    // Disable writes to the color buffer.
    GL11.glDrawBuffer(GL11.GL_NONE);

    int fboStat = GL30.glCheckFramebufferStatus(GL30.GL_DRAW_FRAMEBUFFER);

    if (fboStat != GL30.GL_FRAMEBUFFER_COMPLETE) {
        // fboStat is always == GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT
    }

    GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT);
}

残念ながら、FBO は不完全であり、その理由がわかりません。クロノス_GL_DEPTH_COMPONENT16 は、深度レンダリング可能な唯一の形式です。GL_STENCIL_INDEX8 は、ステンシル レンダリング可能な唯一の形式です。」

キューブ マップを破棄せず、幅/高さが 0 を超えています。スポット ライト シャドウ マッピングに使用している FBO が GL_DEPTH_COMPONENT32 で正常に動作するため、なぜ GL_DEPTH_COMPONENT16 が深度レンダリング可能な唯一の形式なのかわかりません。GL_DEPTH_COMPONENT16 に変更しても、同じエラーが発生します。

何かアドバイス?

4

1 に答える 1