2012-01-23 21 views
1

私は2Dシーン、レンダーターゲットとして設定された2つのテクスチャ、頂点バッファを持っています。direct3dアルファベットとピクセルシェーダ

最初のテクスチャはコントラスト/輝度ピクセルシェーダでフィルタリングされ、2番目のメニューは同じシェーダで処理したくないメニューです。最初のテクスチャは最初のものとアルファベットで表示します。

明度/コントラストの極値になるまではすべて正常に動作しますが、2番目のものを変更するとフェードアウト効果のように見えますが、データは常にフィードされますが非常に極端な場合には再描画を停止します最初の1つ。

AlphaBlendnableを無効にすると修正されますが、アルファブレンディングが緩和されています...ピクセルシェーダを適用する前にバッファをクリーニングする方法はありますか?どんな助けもありがたい。

ピクセルシェーダコード:

float offsetBrightness = 0.0f; \ 
float offsetContrast = 0.0f; \ 
float4 PSBrightnessContrast(float2 inCoord : TEXCOORD0) : COLOR0\ 
{\ 
    float4 color = tex2D(screen, inCoord.xy); \ 
    color = color + offsetBrightness; \ 
    color = color * (1.0 + offsetContrast); \ 
    return saturate(color); \ 
}\ 

レンダリングコード

これは私のために働いてい
// Begin the scene 
    hr = IDirect3DDevice9_BeginScene(d3ddev); 
    if (FAILED(hr)) 
    throw FatalException(DXGetErrorDescription(hr), _T(__FILE__), __LINE__); 

// Render the vertex buffer contents 
hr = IDirect3DDevice9_SetStreamSource(d3ddev, 0, d3dvtc, 0, sizeof(CUSTOMVERTEX)); 
if (FAILED(hr)) { 
    IDirect3DDevice9_EndScene(d3ddev); 
    throw FatalException(DXGetErrorDescription(hr), _T(__FILE__), __LINE__); 
} 

// we use FVF instead of vertex shader 
hr = IDirect3DDevice9_SetFVF(d3ddev, D3DFVF_CUSTOMVERTEX); 
if (FAILED(hr)) { 
    IDirect3DDevice9_EndScene(d3ddev); 
    throw FatalException(DXGetErrorDescription(hr), _T(__FILE__), __LINE__); 
} 

//apply shaders 

UINT shaderPasses; 
if(d3dxShader) 
{ 
    hr = d3dxShader->Begin(&shaderPasses, 0); 
    if (FAILED(hr)) 
     throw FatalException(DXGetErrorDescription(hr), _T(__FILE__), __LINE__); 
} 
else 
    shaderPasses = 1; 

for(UINT uPass = 0; uPass < shaderPasses; ++uPass) 
{ 
    if(d3dxShader) 
    { 
     hr = d3dxShader->BeginPass(uPass); 
     if (FAILED(hr)) 
      throw FatalException(DXGetErrorDescription(hr), _T(__FILE__), __LINE__); 
    } 

    hr = IDirect3DDevice9_SetTexture(d3ddev, 0, (LPDIRECT3DBASETEXTURE9)d3dtex); 
    if (FAILED(hr)) { 
     IDirect3DDevice9_EndScene(d3ddev); 
     throw FatalException(DXGetErrorDescription(hr), _T(__FILE__), __LINE__); 
    } 

    // draw rectangle 
    hr = IDirect3DDevice9_DrawPrimitive(d3ddev, D3DPT_TRIANGLEFAN, 0, 2); 
    if (FAILED(hr)) { 
     IDirect3DDevice9_EndScene(d3ddev); 
     throw FatalException(DXGetErrorDescription(hr), _T(__FILE__), __LINE__); 
    } 

    if(d3dxShader) 
    { 
     hr = d3dxShader->EndPass(); 
     if (FAILED(hr)) 
      throw FatalException(DXGetErrorDescription(hr), _T(__FILE__), __LINE__); 
    } 
} 

if(d3dxShader) 
{ 
    hr = d3dxShader->End(); 
    if (FAILED(hr)) 
     throw FatalException(DXGetErrorDescription(hr), _T(__FILE__), __LINE__); 
} 

// Render the vertex buffer contents 
hr = IDirect3DDevice9_SetStreamSource(d3ddev, 0, d3dvtc, 0, sizeof(CUSTOMVERTEX)); 
if (FAILED(hr)) { 
    IDirect3DDevice9_EndScene(d3ddev); 
    throw FatalException(DXGetErrorDescription(hr), _T(__FILE__), __LINE__); 
} 

// we use FVF instead of vertex shader 
hr = IDirect3DDevice9_SetFVF(d3ddev, D3DFVF_CUSTOMVERTEX); 
if (FAILED(hr)) { 
    IDirect3DDevice9_EndScene(d3ddev); 
    throw FatalException(DXGetErrorDescription(hr), _T(__FILE__), __LINE__); 
} 

// Setup our texture. Using textures introduces the texture stage states, 
// which govern how textures get blended together (in the case of multiple 
// textures) and lighting information. In this case, we are modulating 
// (blending) our texture with the diffuse color of the vertices. 
hr = IDirect3DDevice9_SetTexture(d3ddev, 0, (LPDIRECT3DBASETEXTURE9)d3dtex2); 
if (FAILED(hr)) { 
    IDirect3DDevice9_EndScene(d3ddev); 
    throw FatalException(DXGetErrorDescription(hr), _T(__FILE__), __LINE__); 
} 

// draw rectangle 
hr = IDirect3DDevice9_DrawPrimitive(d3ddev, D3DPT_TRIANGLEFAN, 0, 2); 
if (FAILED(hr)) { 
    IDirect3DDevice9_EndScene(d3ddev); 
    throw FatalException(DXGetErrorDescription(hr), _T(__FILE__), __LINE__); 
} 

// End the scene 
hr = IDirect3DDevice9_EndScene(d3ddev); 
if (FAILED(hr)) 
    throw FatalException(DXGetErrorDescription(hr), _T(__FILE__), __LINE__);  

答えて

0

は、アルファチャンネルが、この場合に考慮しなければならないようだ

float offsetBrightness = 0.0f; \ 
float offsetContrast = 0.0f; \ 
float4 PSBrightnessContrast(float2 inCoord : TEXCOORD0) : COLOR0\ 
{\ 
    float4 pixelColor = tex2D(screen, inCoord.xy); \ 
    pixelColor.rgb /= pixelColor.a; \ 
    \ 
    pixelColor.rgb = ((pixelColor.rgb + 1.0f) * max(offsetContrast, 0)) - 1.0f; \ 
    pixelColor.rgb += offsetBrightness; \ 
    pixelColor.rgb *= pixelColor.a; \ 
\ 
return pixelColor;\ 
}\ 
関連する問題