ポイント ライトのシャドウ マッピングをサポートするには、深度値をキューブマップの 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 に変更しても、同じエラーが発生します。
何かアドバイス?