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__);