游戏开发论坛

 找回密码
 立即注册
搜索
查看: 6914|回复: 5

[DX9]渲染到纹理的一个问题:顶点颜色的alpha分量显示异常

[复制链接]

13

主题

36

帖子

301

积分

中级会员

Rank: 3Rank: 3

积分
301
发表于 2014-4-28 16:31:03 | 显示全部楼层 |阅读模式
我的目的是要将一个带有alpha的图片,渲染到一张纹理上,并且在渲染的时候,我需要调整纹理的整体alpha(修改顶点颜色的alpha分量)

结果渲染出的纹理比正确结果偏暗:
dd.png

以下是实现代码:
  1. void MainLoop()
  2. {
  3.         g_D3DInfo.m_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, 0xFFC8C8C8, 1.0f, 0);
  4.         g_D3DInfo.m_pD3DDevice->BeginScene();

  5.         g_D3DInfo.m_pD3DDevice->SetFVF(D3DFVF_2D);

  6.         static bool bRTT = true;
  7.         IDirect3DSurface9* pOldSurface = NULL;
  8.         IDirect3DTexture9* pDstTexture = NULL;

  9.         if (bRTT)
  10.         {
  11.                 // 用于RTT的纹理必须是D3DUSAGE_RENDERTARGET、D3DPOOL_DEFAULT参数
  12.                 if (SUCCEEDED(D3DXCreateTexture(g_D3DInfo.m_pD3DDevice, 1024, 1024, 0, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &pDstTexture)))
  13.                 {
  14.                         g_D3DInfo.m_pD3DDevice->GetRenderTarget(0, &pOldSurface);        // 保存当前的渲染目标表面

  15.                         IDirect3DSurface9* pDstSurface = NULL;
  16.                         pDstTexture->GetSurfaceLevel(0, &pDstSurface);
  17.                         g_D3DInfo.m_pD3DDevice->SetRenderTarget(0, pDstSurface);                        // 设置渲染目标

  18.                         g_D3DInfo.m_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0);
  19.                 }
  20.                 else
  21.                 {
  22.                         bRTT = false;
  23.                 }
  24.         }

  25.         // 渲染部分
  26.         {
  27.                 D3D_RenderTexture(g_pTexture, g_ImgWidth, g_ImgHeight, g_TextureWidth, g_TextureHeight, 100, 100, 0, 0, NULL, 0x7FFFFFFF);
  28.         }

  29.         if (bRTT)
  30.         {
  31.                 g_D3DInfo.m_pD3DDevice->SetRenderTarget(0, pOldSurface);        // 恢复渲染目标表面
  32.                 pOldSurface = NULL;

  33.                 // 输出最终纹理
  34.                 {
  35.                         ID3DXBuffer* pD3DXBuffer = NULL;
  36.                         D3DXCreateBuffer(1024*1024*4 + sizeof(STGA_HEADER), &pD3DXBuffer);

  37.                         D3DXSaveTextureToFileInMemory(&pD3DXBuffer, D3DXIFF_TGA, pDstTexture, NULL);

  38.                         FILE* pFile = NULL;
  39.                         fopen_s(&pFile, "out.tga", "wb");
  40.                         fwrite(pD3DXBuffer->GetBufferPointer(), pD3DXBuffer->GetBufferSize(), 1, pFile);
  41.                         fclose(pFile);

  42.                         pD3DXBuffer->Release();
  43.                 }

  44.                 pDstTexture->Release();

  45.                 bRTT = false;
  46.         }

  47.         g_D3DInfo.m_pD3DDevice->EndScene();
  48.         g_D3DInfo.m_pD3DDevice->Present(NULL, NULL, NULL, NULL);
  49. }
复制代码

如何才能得到正确的渲染结果?

13

主题

36

帖子

301

积分

中级会员

Rank: 3Rank: 3

积分
301
 楼主| 发表于 2014-4-28 16:40:34 | 显示全部楼层
完整代码:
Main.doc (20.57 KB, 下载次数: 246)
把后缀改成.cpp

17

主题

44

帖子

271

积分

中级会员

Rank: 3Rank: 3

积分
271
发表于 2014-6-15 14:19:27 | 显示全部楼层
我看了先你的代码 之所以变得比较黑是因为你每帧刷新的背景颜色不是白色 alpha混合的时候会将Colors * aplha + Colord * (1-alpha) 背景色如果是黑色的话混合出来的效果应该会更暗

102

主题

2443

帖子

7639

积分

论坛元老

Rank: 8Rank: 8

积分
7639
发表于 2014-6-15 14:48:29 来自手机 | 显示全部楼层
支持板凳,啊帕通道本身就是透明的(虽然我不懂)

13

主题

36

帖子

301

积分

中级会员

Rank: 3Rank: 3

积分
301
 楼主| 发表于 2014-6-20 17:38:17 | 显示全部楼层
本帖最后由 书径尘 于 2014-6-20 17:40 编辑
新撰组 发表于 2014-6-15 14:19
我看了先你的代码 之所以变得比较黑是因为你每帧刷新的背景颜色不是白色 alpha混合的时候会将Colors * aplh ...

我就是希望背景色是0,
这么说吧:
我要将两张带有半透明的图片,混合到一张纹理上,然后把这个纹理像素提取出来,绘制到另一个非DX9的运行环境之上,

所以,背景不能有其他颜色,必须是完全透明的。

17

主题

44

帖子

271

积分

中级会员

Rank: 3Rank: 3

积分
271
发表于 2014-7-5 09:19:28 | 显示全部楼层
书径尘 发表于 2014-6-20 17:38
我就是希望背景色是0,
这么说吧:
我要将两张带有半透明的图片,混合到一张纹理上,然后把这个纹理像素提 ...

你可以把背景设为白色试试
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-2-26 02:06

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表