- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 DirectX 9 开发游戏。这是我正在尝试做的事情:
渲染场景后,我想在它上面渲染一些 Sprite :整个场景上的黑色覆盖物和一些 Sprite ,它们是显示覆盖物应该有孔的蒙版。到目前为止,我尝试搞乱混合模式但没有运气。我的设置代码如下所示:
D3DD->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
D3DD->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
D3DD->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
我想最好的方法是将每个 Sprite 的 alpha 相乘,但根据 http://msdn.microsoft.com/en-us/library/windows/desktop/bb172508%28v=vs.85%29.aspx不支持这种模式。还有其他方法吗?
edit
根据 Nico Schertler 的回答,这是我想出的代码:
LPDIRECT3DTEXTURE9 pRenderTexture;
LPDIRECT3DSURFACE9 pRenderSurface,
pBackBuffer;
// create texture
D3DD->CreateTexture(1024,
1024,
1,
D3DUSAGE_RENDERTARGET,
D3DFMT_R5G6B5,
D3DPOOL_DEFAULT,
&pRenderTexture,
NULL);
pRenderTexture->GetSurfaceLevel(0,&pRenderSurface);
// store old render target - back buffer
D3DD->GetRenderTarget(0,&pBackBuffer);
// set new render target - texture
D3DD->SetRenderTarget(0,pRenderSurface);
//clear texture to opaque black
D3DD->Clear(0,
NULL,
D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
D3DCOLOR_XRGB(0,0,0),
32.0f,
0);
// set blending
D3DD->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ZERO);
D3DD->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);
D3DD->SetRenderState(D3DRS_SRCBLENDALPHA, D3DBLEND_ZERO);
D3DD->SetRenderState(D3DRS_DESTBLENDALPHA, D3DBLEND_SRCALPHA);
D3DD->SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE, TRUE);
//// now I render hole sprites the usual way
// restore back buffe as render target
D3DD->SetRenderTarget(0,pBackBuffer);
// restore blending
D3DD->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
D3DD->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
D3DD->SetRenderState(D3DRS_SRCBLENDALPHA, D3DBLEND_SRCALPHA);
D3DD->SetRenderState(D3DRS_DESTBLENDALPHA, D3DBLEND_INVSRCALPHA);
D3DD->SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE, FALSE);
ulong color = ulong(-1);
Vertex2D v[4];
v[0] = Vertex2D(0, 0, 0);
v[1] = Vertex2D(1023, 0, 0);
v[3] = Vertex2D(1023, 1023, 0);
v[2] = Vertex2D(0, 1023, 0);
D3DD->SetTexture(0, pRenderTexture);
D3DD->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1);
D3DD->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, v, sizeof(Vertex2D));
D3DD->SetTexture(0, NULL);
// release used resources
pRenderTexture->Release();
pRenderSurface->Release();
pBackBuffer->Release();
不幸的是,应用程序在恢复旧的渲染目标时崩溃了。有什么建议吗?
最佳答案
首先,您应该先在单独的纹理中创建 mask 。然后您可以根据需要添加孔。最后,在屏幕上绘制 mask :
Initialize the texture
Clear it to opaque black
Using the following blend states:
D3DRS_SRCBLEND -> D3DBLEND_ZERO (hole's color does not matter)
D3DRS_DESTBLEND -> D3DBLEND_ONE (preserve the black color)
D3DRS_SRCBLENDALPHA -> D3DBLEND_ZERO
D3DRS_DESTBLENDALPHA -> D3DBLEND_SRCALPHA
D3DRS_SEPARATEALPHABLENDENABLE -> TRUE
Draw each hole sprite
Restore default blending (src_alpha / inv_src_alpha)
Render the texture as a sprite to the back buffer
上面的混合状态假定孔洞在应该有孔洞的地方是不透明的。然后,颜色计算如下:
blended color = 0 * hole sprite color + 1 * background color
它应该总是黑色的。
Alpha channel 的计算方式是:
blended alpha = 0 * hole sprite alpha + (1 - hole sprite alpha) * background alpha
因此,在孔 Sprite 不透明的地方,混合 alpha 变为 0。在透明的地方,混合 alpha 为之前的值。介于两者之间的值是混合的。
关于c++ - DirectX alpha 掩蔽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17950565/
我正在尝试弄清楚如何屏蔽相对路径上的路径。这是我为 CSS 文件实现的自定义缩小器脚本,需要绝对相对路径。 假设我在 CSS 文件中有以下内容 url('../images/file.jpg') 这个
我正在尝试在我的 WordPress 图片/帖子中创建以下内容。 我也需要它具有响应能力,所以我使用了 Bootstrap 3 和背景图片。 帖子的代码片段: Titl
在考虑如何优化方面,我仍然是一个成熟的人。我有这部分代码,它接受已找到的峰的列表,并找到这些峰,+/- 某个值,位于多维数组中的位置。然后它将 +1 添加到它们的 zeros 数组的索引中。代码运行良
我正在使用 DirectX 9 开发游戏。这是我正在尝试做的事情: 渲染场景后,我想在它上面渲染一些 Sprite :整个场景上的黑色覆盖物和一些 Sprite ,它们是显示覆盖物应该有孔的蒙版。到目
有一个丰富的 UI 应用程序,我想在其中显示像这样复杂形状的图像 现在我想要的是根据蒙版图像裁剪我的图像,实际上 图像是动态的,可以从相机或图库(正方形或矩形形状)导入,我希望该图像适合在我上面的布局
我试图在谷歌地图应用程序上应用聚光灯效果。具体来说,我画了一个跟随鼠标的圆圈,并将其设置为 map 上的 mask 。问题是只显示了圆圈内的 map 区域,我知道它应该是面具的样子,但是有没有办法让圆
我正在使用 OpenGL/GLSL 实现一个绘图应用程序。有一个功能,用户可以使用带有图案图像的画笔绘制“蒙版”,同时背景会根据画笔的位置而变化。看看视频就明白了:video 我使用 CALayer
我正在尝试使用 HTML 和 CSS 创建一个“眨眼”动画。 我想要的是,当眼睛眨眼时,眼球不显示。 从代码中可以看出,眼睛由 4 个元素组成。 Div“眼睛”是眼睛所在的容器。 划分“eye1”和“
我正在尝试渲染 3 种纹理,-背景- 黑/白前景 mask -前景 我用过这个OpenGL - mask with multiple textures因为它准确地描述了我的问题。但我无法让它工作。我只
我正在尝试使用具有不同时间长度的序列在 Keras 中拟合 RNN。我的数据位于格式为 (sample, time, feature) = (20631, max_time, 24) 的 Numpy
所以,我想屏蔽 SparseTensor 的整行。使用 tf.boolean_mask 很容易做到这一点,但没有与 SparseTensor 等效的方法。目前,我可以只遍历 SparseTensor.
我正在尝试快速屏蔽图像。这是我的代码: (通常,originalImg 是从 UIImagePickerController 加载的图像,然后由 UIGraphicsGetImageFromCurre
我正在尝试使用 System.Drawing.Graphics 使用源 Bitmap 和 alpha 掩码 Bitmap 绘制图像目的。目前我循环 X 和 Y 并使用 GetPixel 和 SetPi
我是一名优秀的程序员,十分优秀!