我有一个2D场景,2个纹理设置为渲染目标,以及一个顶点缓冲区。
第一个纹理被对比度/亮度像素着色器过滤掉,第二个作为菜单,我不希望它被同一个着色器处理,但希望它与第一个混合在一起。
一切都运行得很好,直到我将亮度/对比度设置为极值,这看起来就像更改第二个时的淡出效果,在非常极端的情况下,它会停下来重新绘制,尽管数据总是提供给第一个。
禁用AlphaBlendnable可以纠正它,但我丢失了alpha混合...有没有办法在应用像素着色器之前清理缓冲区?感谢您的帮助。
像素着色器代码:
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__ ); 发布于 2012-01-23 22:37:06
这对我来说很有效,似乎在这种情况下必须考虑alpha通道。
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;\
}\https://stackoverflow.com/questions/8972210
复制相似问题