0

シャドウ システムを正しく動作させることができません。次のコードを使用して FBO を生成します。

int frameBuffer = GL30.glGenFramebuffers();
GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, frameBuffer);
GL11.glDrawBuffer(GL11.GL_NONE);
GL11.glReadBuffer(GL11.GL_NONE);

int texture = GL11.glGenTextures();
GL11.glBindTexture(GL11.GL_TEXTURE_2D, texture);
GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL14.GL_DEPTH_COMPONENT16, WIDTH, HEIGHT, 0,
GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, (ByteBuffer) null);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE);
GL32.glFramebufferTexture(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, texture, 0);

GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
GL11.glViewport(0, 0, Display.getDisplayMode().getWidth(), Display.getDisplayMode().getHeight());

デフォルトのレンダラー (出力 vec4) でエンティティが正常にレンダリングされます。私のシャドウ シェーダー コードは簡単です。

#version 430
layout(location = 0) out float fragmentdepth;

void main(void){
    fragmentdepth =  gl_FragCoord.z;
}

FBO を使用せずに vec4(1.0) を出力しようとしましたが、すべて正常に機能したため、計算は正しく、シェーダー コードも同様に機能するはずです。

私のドローコールは次のようになります。

GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, frameBuffer);
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT|GL11.GL_DEPTH_BUFFER_BIT);
renderShadows();
GL30.glBindFramebuffer(GL30.GL_FRAMEBUFFER, 0);
renderAllItems();
Display.sync(FPS_CAP);
Display.update();
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT|GL11.GL_DEPTH_BUFFER_BIT);
GL11.glClearColor(0.2f,0.1f,0.1f , 1f);

「renderAllItems();」を呼び出すと また、深度テクスチャを表示する必要がある右上隅にクワッドをレンダリングしています。しかし、私が見るのは赤いクワッドだけです。黒/白で何かを表示するべきではありませんか?

4

1 に答える 1

2
GL32.glFramebufferTexture(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, texture, 0);

これにより、フレーム バッファ オブジェクトの深度アタッチメントにテクスチャがアタッチされます。

layout(location = 0) out float fragmentdepth;

これは、フラグメント シェーダーからのユーザー定義の出力です。ユーザー定義の出力はフラグメントの色にマップされ、デプス アタッチメントではなく、FBO のカラー アタッチメントに書き込まれます。

フラグメントの深さは、深さの添付ファイルに書き込まれるものです。FS では、それが組み込みのgl_FragDepthoutputです。ただし、それに書き込む理由はありません。書き込みを行わない場合は、 によって自動的に入力されgl_FragCoord.zます。

実際、深度をレンダリングすることだけが必要な場合は、フラグメント シェーダーを使用する必要さえありません

于 2016-12-04T00:06:01.227 に答える