2016-05-25 20 views
1

4x4テクスチャから2x2テクスチャテクスチャにダウンサンプリングしたいと思っています。素敵なものを2x2から4x4にアップサンプルしてみましょう。正しい近隣テクセルオフセットをどのように計算するのですか?私は双線形フィルタリングまたは最近接フィルタリングを使うことができません。私は各フラグメントの実行のために4つのサンプルを選び、ダウンサンプリングの前に最大のものを選ぶ必要があります。アップサンプリングパスについても同様であり、すなわち、フラグメント実行ごとに4つのサンプルを選択する必要がある。ダウンサンプルとテクスチャオフセットのアップサンプル、OpenGL GLSL

近隣オフセットを正しく計算しましたか(フルスクリーンクワッドを使用していますか?)

//Downsample: 1.0/2.0, Upsample: 1.0/4.0. 
vec2 texelSize = vec2(1.0/textureWidth, 1.0/textureHeight); 

const vec2 DOWNSAMPLE_OFFSETS[4] = vec2[] 
(
    vec2(-0.5, -0.5) * texelSize, 
    vec2(-0.5, 0.5) * texelSize, 
    vec2(0.5, -0.5) * texelSize, 
    vec2(0.5, 0.5) * texelSize 
); 

const vec2 UPSAMPLE_OFFSETS[4] = vec2[] 
(
    vec2(-1.0, -1.0) * texelSize, 
    vec2(-1.0, 1.0) * texelSize, 
    vec2(1.0, -1.0) * texelSize, 
    vec2(1.0, 1.0) * texelSize 
); 

//Fragment shader. 
#version 400 core 

uniform sampler2D mainTexture; 
in vec2 texCoord; 
out vec4 fragColor; 

void main(void) 
{ 
    #if defined(DOWNSAMPLE) 
    vec2 uv0 = texCoord + DOWNSAMPLE_OFFSETS[0]; 
    vec2 uv1 = texCoord + DOWNSAMPLE_OFFSETS[1]; 
    vec2 uv2 = texCoord + DOWNSAMPLE_OFFSETS[2]; 
    vec2 uv3 = texCoord + DOWNSAMPLE_OFFSETS[3]; 
    #else 
    vec2 uv0 = texCoord + UPSAMPLE_OFFSETS[0]; 
    vec2 uv1 = texCoord + UPSAMPLE_OFFSETS[1]; 
    vec2 uv2 = texCoord + UPSAMPLE_OFFSETS[2]; 
    vec2 uv3 = texCoord + UPSAMPLE_OFFSETS[3]; 
    #endif 

    float val0 = texture(mainTexture, uv0).r; 
    float val1 = texture(mainTexture, uv1).r; 
    float val2 = texture(mainTexture, uv2).r; 
    float val3 = texture(mainTexture, uv3).r; 

    //Do some stuff... 

    fragColor = ...; 
} 
+0

あなたは別のサンプル数(これはデフォルトのマルチサンプリングであなたのためにOKの場合) –

+0

はそれは私の場合には不可能であるmultisampleTextureにFBOとrederを使用することができ、深みのあるテクスチャをダウンサンプリングし、ピクセルの滲みを避けるために別のテクスチャをアップサンプリングする必要があるからです。したがって、私は双線形近所を手動で比較しなければならない。 – karl88

答えて

1

オフセットはtexelSizeは両方のケースでのテクセルサイズはターゲットをレンダリングしていると仮定すると、正しく見えます。つまり、アップサンプリングパスよりもダウンサンプリングパスの2倍の大きさです。アップサンプリングの場合、ソーステクセルセンターに正確に当たるわけではありませんが、最も近いネイバーフィルタリングがそれらを目的の結果にスナップするほど近くに来ます。

ARB_texture_gather拡張子に指定されたtextureGather命令を使用すると、より効率的なオプションが利用できます。テクスチャのサンプリングに使用すると、フィルタリングに使用される4つのテクセルが返されます。 vec4を生成するために各テクセルの1つのコンポーネントだけを返しますが、赤のコンポーネントだけを気にするので、拡張が利用可能な場合は理想的なソリューションです。コードは、ダウンサンプリングとアップサンプリングの両方に同じようになります:

#define GATHER_RED_COMPONENT 0 
vec4 vals = textureGather(mainTexture, texcoord, GATHER_RED_COMPONENT); 

// Output the maximum value 
fragColor = max(max(vals.x, vals.y), max(vals.z, vals.w)); 
+0

確認していただきありがとうございます!私はOpenGL 4.0を使用しており、textureGatherは拡張機能を必要としません。私はそれを試してみるつもりだ、もう一度感謝:) – karl88

関連する問題