テクスチャ(シェーダー、フォント用)にレンダリングできるようにしたいのですが、クワッドを適切に配置するのに問題があります(フレームバッファー自体が適切に機能します)。結果として得られる(コピーされた)テクスチャは、ほとんどの場合、左上のコーダーを示し、残りはトリミングされます。これは、長方形のテクスチャの場合はさらに悪く、正方形のテクスチャの場合はほとんど効果がありません(したがって、この動作を何日も認識していません)
コード例:
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());
}
画像の例:
アッパーは、コピーされたバージョンの下に、レンダリングされた元の画像です。
私は何が間違っているのですか?
更新:テクスチャがダウンサンプリングされているようです