2017-09-15 8 views
0

API glGetIntegervを使用して、ビューポートとテクスチャの最大サイズを取得します。両方とも16K x 16Kピクセルを返します。ここでOpenGLでスーパーサイズのテクスチャをレンダリングする方法

はコードです:

GLint maxTexture,maxViewport; 
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTexture); 
glGetIntegerv(GL_MAX_VIEWPORT_DIMS, &maxViewport); 

私は、高解像度の一連の画像を表示するために、テクスチャの大きいサイズを必要とするが。ビューポートサイズを32K x 32Kに設定しようとしましたが、プログラムは正常に実行されました。 API glGetIntegervから取得したビューポートの最大サイズが正しくないようです。

しかし、テクスチャサイズを16K x 16Kより大きい値に設定することはできません。 多分、私は複数のテクスチャユニットを作成しようとする必要があり、それぞれのサイズは16K x 16Kです。

誰かが手動ホールスライドイメージングと呼ばれるアプリケーションを提供しています。ここ はハイパーリンクです:

http://www.microvisioneer.com/

スーパーサイズの質感は、このアプリケーションで実現しているようです。 OpenGLは私の問題を解決するための正しいツールですか、それとも他の解決方法がありますか?

更新:私は、ビューポートを32K x 32Kに設定してもエラーは発生しませんでしたが、実際のサイズはまだ16K x 16Kです。

+1

「1024 * 16 * 1024 * 16」のサイズはどういう意味ですか?使用するクエリは、* width *(ビューポートの* height *)の値を返します。カードによって返された値を検索することができます(http://opengl.gpuinfo.org/gl_stats_caps_single.php?listreportsbycap=GL_MAX_TEXTURE_SIZE)値は、インストールされているハードウェアの最大表示サイズで十分です。 – Ripi2

+0

@ Ripi2に言及しました。あなたが話していることは、ビューポートに関するものであり、テクスチャを行うことは何もありません。テクスチャはハードウェアに基づいて最大サイズを持ち、任意のサイズを任意のサイズのビューポートにレンダリングできます。 – Ketan

+0

glViewportは、指定された範囲に自動的にクランプします。これはエラーではありません。 – Andreas

答えて

0

RGBA8タイプの使用を検討してください。

uint8_t rgba[4] = {0x00, 0x44, 0x66, 0xff}; 

しかし、あなたがしても、それを表すことができ:Cでは、それは次のようになります。同様のタイプのRGBA32ため

uint32_t rgba = 0x004466ff; 

:あなたは任意のそれらのビットを処理するために許可されているもつとも

uint32_t rgba[4] = {0x00000000, 0x44000000, 0x66000000, 0xff000000}; 
// or 
uint128_t _rgba = 0x000000004400000066000000ff000000; // assuming there is a uint128_t... 

あなたは欲しい。あなたが可能性:

そんなに上の緑のチャンネルに赤 OpenGLの内部rgba32テクスチャのチャンネル、TEX2にTEX1のRGBA8データを入れている上記の例では
uint128_t rgba[4] = {tex1rgba, tex2rgba, tex3rgba, tex4rgba}; 

。テクスチャが実生活で2x2の方法でエッジごとに存在すると仮定すると、テクスチャ(0.1,0.1)はtexcoord 2 *(0.1,0.1)の赤チャンネルのrgba8値をマッピングします。 Texcoord(0.6,0.7)は、アルファチャンネルのテクスチャが赤チャンネルのテクスチャに対して斜めに配置されていると仮定して、アルファチャンネルのrgba8に2 *(0.6-0.5,0.7-0.5)でマッピングします。

私のアプリケーションが8ビットチャネルのみをサポートするプラットフォームで16ビットの輝度(L16またはR16)をサポートするために、この技術を自分自身を逆方向に使用しました。基本的には、16ビットのシングルチャンネルテクスチャを8ビットのデュアルチャンネルテクスチャにロードし、ハイ/ローワードとしてシェーダに分割しました。

このとき、GL_LINEARなどのテクスチャフィルタリングは使用できません。自分自身をフィルタリングする必要があります。私の経験では、これは実際には大きな問題ではありません。

関連する問題