OpenGLで高解像度のレンダリングを行うのはちょっと難しいです。 1つの問題は、ピクセル所有テストが途中で行われることです。もう1つは、フレームバッファ(オブジェクト)の最大サイズです。最初の問題は、フレームバッファオブジェクトまたはPBufferを使用することで解決できます。
2つめのトリッキーが必要です.WとHが最大フレームバッファサイズを超えるサイズW×Hのイメージをレンダリングするとします。 GL_MAX_VIEWPORT_SIZE、GL_MAX_TEXTURE_SIZE、GL_MAX_RENDERBUFFER_SIZEのトークンのglGetInteger
は、これらの制限を示しています。だからあなたがしなければならないことは、ターゲット画像をそれらの限界よりも小さいタイルに分割し、それらのタイルをレンダリングし、次にそれらを再結合することです。 W_tとH_tがタイルサイズ、W_t := W/N
、H_t := H/M
であり、それに応じたサイズのPBufferまたはFramebufferオブジェクトがあるとします。その後、我々は2ループでこれらのタイルをレンダリングすることができます。
for m in 0 to M: for n in 0 to N:
render_tile(n, m)
それでは、どのようrender_tile(n,m)
が見えますか?
render_tile(n,m):
どうやら私たちはどのような変更が投影されレンダよう
glViewport(0, 0, W_t, H_t)
を全体のタイルを使用しているが。どういうわけか、投影面のタイルと一緒に投影をシフトしなければなりません。投影面は、「近い」面としても知られています。近く飛行機のエクステントは、right - left
とtop - bottom
ているので、我々はサイズ(right - left)/N
×(top - bottom)/M
のタイルに近い平面を分割しているので、それは我々がシフトステップサイズとして使用するために必要なものです:
shift_X = (right - left)/N
shift_Y = (top - bottom)/M
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
switch Projection:
case Ortho:
glOrtho(left + shift_X * n, left + shift_X * (n+1),
bottom + shift_Y * m, bottom + shift_Y * (n+1),
near, far)
case Perspective:
glFrustum(left + shift_X * n, left + shift_X * (n+1),
bottom + shift_Y * m, bottom + shift_Y * (n+1),
near, far)
render_scene()
そして、ちょうどどの場合私たちは、透視用left, right, top, bottom
を得る:
right = -0.5 * tan(fov) * near
left = -right;
top = aspect * right
bottom = -top
私はX 2500の周りに3000にスピンボタンを使用して、サイズを調整し、QStackedWidget内部派生QGLWidgetを配置することにより、QtのでテストしてからglReadPixelsとQGLWidget :: RenderPixmap(両方を使用している)にそのQGLWidgetのスクリーンショットをキャプチャして保存します。 QGLWidgetはGUIアプリケーション上で部分的にしか見えませんが、保存されたスクリーンショットは完璧です。 Qtがピクセルオーナーシップテストをかなりうまく処理したように思えます:) 提案されたソリューションは本当に面白いです。 OpenGLについての私の知識はまだ基本的な基本的な固定パイプラインなので、もっと読む必要があると思います。 – ksming
Qtはピクセルオーナーシップテストを「処理」しません。 OpenGL仕様で定義されており、Qtが動作するレベルではなく、Win32/X-Windows/graphics-driver/etcレベルで処理されます。それがあなたにとってうまくいけば、この特定の低レベルのウィンドウシステムでは、あなたは_lucky_を持っているからです。それは信頼されるべきではありません。 –