游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1707|回复: 3

alpha混合能用但为什么alpha测试不行?

[复制链接]

15

主题

31

帖子

35

积分

注册会员

Rank: 2

积分
35
发表于 2004-12-12 19:39:00 | 显示全部楼层 |阅读模式





在DX9的SDK例子中有一个textures的 tutorials(教程),它的效果是在“世界”中显示一个纹理:

//创建:
//create:
D3DXCreateTextureFromFile( g_pd3dDevice, "banana.bmp", &g_pTexture );

g_pd3dDevice->CreateVertexBuffer( 50*2*sizeof(CUSTOMVERTEX),
                                                  0, D3DFVF_CUSTOMVERTEX,
                                                  D3DPOOL_DEFAULT, &g_pVB, NULL ) ;

CUSTOMVERTEX* pVertices;
    if( FAILED( g_pVB->Lock( 0, 0, (void**)&pVertices, 0 ) ) )
        return E_FAIL;
    for( DWORD i=0; i<50; i++ )
    {
        FLOAT theta = (2*D3DX_PI*i)/(50-1);

        pVertices[2*i+0].position = D3DXVECTOR3( sinf(theta),-1.0f, cosf(theta) );
        pVertices[2*i+0].color    = 0xffffffff;
#ifndef SHOW_HOW_TO_USE_TCI
        pVertices[2*i+0].tu       = ((FLOAT)i)/(50-1);
        pVertices[2*i+0].tv       = 1.0f;
#endif

        pVertices[2*i+1].position = D3DXVECTOR3( sinf(theta), 1.0f, cosf(theta) );
        pVertices[2*i+1].color    = 0xff808080;
#ifndef SHOW_HOW_TO_USE_TCI
        pVertices[2*i+1].tu       = ((FLOAT)i)/(50-1);
        pVertices[2*i+1].tv       = 0.0f;
#endif
    }
    g_pVB->Unlock();


//渲染:
//render:
      g_pd3dDevice->SetTexture( 0, g_pTexture );
        g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_MODULATE );
        g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
        g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
        g_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP,   D3DTOP_DISABLE );

    #ifdef SHOW_HOW_TO_USE_TCI
               D3DXMATRIXA16 mat;
        mat._11 = 0.25f; mat._12 = 0.00f; mat._13 = 0.00f; mat._14 = 0.00f;
        mat._21 = 0.00f; mat._22 =-0.25f; mat._23 = 0.00f; mat._24 = 0.00f;
        mat._31 = 0.00f; mat._32 = 0.00f; mat._33 = 1.00f; mat._34 = 0.00f;
        mat._41 = 0.50f; mat._42 = 0.50f; mat._43 = 0.00f; mat._44 = 1.00f;

        g_pd3dDevice->SetTransform( D3DTS_TEXTURE0, &mat );
        g_pd3dDevice->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2 );
        g_pd3dDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION );
    #endif

//以下为我添加的代码:
//my cord:
//-----------------------------------------------------------------------------------------------------------------------------------------------
g_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE,   TRUE ); //打开ALPHA混合让颜色键透明 //use alpha blend,it's ok
g_pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCCOLOR);
g_pd3dDevice->SetRenderState( D3DRS_DESTBLEND,D3DBLEND_INVSRCCOLOR );
//以上三行为alpha混合,可以实现

//以下三行我认为应该是alpha测试,作用应为让颜色值小于0x00000f0的点不显示,但却不成功!!!
//为什么???
     g_pd3dDevice->SetRenderState( D3DRS_ALPHATESTENABLE, TRUE ); use alpha test ,it's don't
       g_pd3dDevice->SetRenderState( D3DRS_ALPHAREF, 0x00000f0  );
        g_pd3dDevice->SetRenderState( D3DRS_ALPHAFUNC, D3DCMP_GREATER);
//-------------------------------------------------------------------------------------------------------------------------------------------------

        // Render the vertex buffer contents
        g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
        g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
        g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2*50-2 );

        // End the scene
        g_pd3dDevice->EndScene();
    }

    // Present the backbuffer contents to the display
    g_pd3dDevice-&gtresent( NULL, NULL, NULL, NULL );


请教这是为什么? 不胜感激!














[em24]

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20686
发表于 2004-12-12 21:28:00 | 显示全部楼层

Re:alpha混合能用但为什么alpha测试不行?

为何不在texture的alpha通道数据中直接修改?

18

主题

573

帖子

573

积分

高级会员

Rank: 4

积分
573
发表于 2004-12-12 21:34:00 | 显示全部楼层

Re:alpha混合能用但为什么alpha测试不行?

alpha测试只是除去那些“alpha”值与你设置的参考值(也是指alpha,不是颜色值)通过测试函数测试不等的点。
1、你的那个参考值0x00000f0,指的是需要除去那些“alpha”值小于你的参考值的点。
2、你的程序中有alpha值小于0x00000f0的点存在吗???
3、好像你的alpha混合也设置错了,应该是D3DBLEND_SRCCOLORALPHA和D3DBLEND_INVSRCCOLORALPHA吧!要不然就变成颜色值的混合,而不是alpha值的混合了。

15

主题

31

帖子

35

积分

注册会员

Rank: 2

积分
35
 楼主| 发表于 2004-12-16 19:40:00 | 显示全部楼层

好像有点麻烦

我的纹理实际上是一个mpg格式的视频,在这样的纹理中是不是无法设置alpha值,能不能用颜色值?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-23 18:00

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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