4

テクスチャ(シェーダー、フォント用)にレンダリングできるようにしたいのですが、クワッドを適切に配置するのに問題があります(フレームバッファー自体が適切に機能します)。結果として得られる(コピーされた)テクスチャは、ほとんどの場合、左上のコーダーを示し、残りはトリミングされます。これは、長方形のテクスチャの場合はさらに悪く、正方形のテクスチャの場合はほとんど効果がありません(したがって、この動作を何日も認識していません)

コード例:

    public Texture copy(final Texture tex) {
    final int tempTex = glGenTextures();
    Draw.bindTexture(tempTex);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex.getImageWidth(), tex.getImageHeight(), 0, GL_RGB, GL_UNSIGNED_BYTE, (ByteBuffer)null);

    // Adjust projection matrix
    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glLoadIdentity();
    glViewport(0, 0, tex.getImageWidth(), tex.getImageHeight());

    // Change blendmode to ignore the transparent background
    Draw.blendingMode(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

    // Prepare fbo, add the texture as backend and clear it
    final int fbo = glGenFramebuffers();
    glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tempTex, 0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    // Finally draw
    Draw.bindTexture(tex.getId());
    glBegin(GL_QUADS);
    {
        glTexCoord2f(0, 0);
        glVertex2f(-1, -1);
        glTexCoord2f(1, 0);
        glVertex2f(1, -1);
        glTexCoord2f(1, 1);
        glVertex2f(1, 1);
        glTexCoord2f(0, 1);
        glVertex2f(-1, 1);
    }
    glEnd();

    // Unbind framebuffer
    glBindFramebuffer(GL_FRAMEBUFFER, 0);

    // Reset projection matrix
    glViewport(0, 0, 1920, 1080); // TODO Don't hardcode
    glPopMatrix();

    return new Texture(tempTex, tex.getImageWidth(), tex.getImageHeight());
}

画像の例:

ここに画像の説明を入力してください

アッパーは、コピーされたバージョンの下に、レンダリングされた元の画像です。

私は何が間違っているのですか?


更新:テクスチャがダウンサンプリングされているようです

ここに画像の説明を入力してください

4

2 に答える 2

1

実際のテクスチャの幅と高さを texcoords に渡すべきではありません。テクスチャ座標の範囲は 0 (下と左) から 1 (上と右) です。実際のテクスチャの寸法をテクスチャ座標にハードコーディングしません。

texcoord 関数の getWidth/getHeight を「1」に置き換えてみてください

于 2012-05-07T18:00:48.887 に答える
0

最良の方法は、ディスプレイのサイズ(1920x1080)の正射影行列を使用することです。テクスチャは2パウサイズのテクスチャである必要があるため、2048x2048にする必要があります。結果をテクスチャの長方形にレンダリングすると(テクスチャ全体にフィットしない)、同じマトリックスを使用して画面にレンダリングすることができます。(正しいピクセル)

于 2012-05-09T11:20:55.713 に答える