游戏开发论坛

 找回密码
 立即注册
搜索
12
返回列表 发新帖
楼主: huawenguang

求助:关于多纹理映射

[复制链接]

2

主题

18

帖子

24

积分

注册会员

Rank: 2

积分
24
发表于 2005-10-12 11:27:00 | 显示全部楼层

Re:求助:关于多纹理映射

//first select hair texture
pD3DDevice9->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE);
pD3DDevice9->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_SELECTARG1);
pD3DDevice9->SetTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_TEXTURE);
pD3DDevice9->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_SELECTARG1);

//select alpha texture
pD3DDevice9->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_CURRENT);
pD3DDevice9->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_SELECTARG1);
pD3DDevice9->SetTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_TEXTURE);
pD3DDevice9->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_SELECTARG1);
这是D3D下的方法,在OpenGL下一定有相应的类似方法.

24

主题

256

帖子

267

积分

中级会员

Rank: 3Rank: 3

积分
267
 楼主| 发表于 2005-10-12 14:34:00 | 显示全部楼层

Re:求助:关于多纹理映射

正如landwolf所说的,在OpenGL下一定有相应的类似方法.只是到目前我还没找到。还过我跟据sm3d的提示,找到了一种稍为变通一点的方法,如下:

1、不用多纹理,只用单纹理。
2、把单纹理设为RGBA格式。
3、读取alpha图片的每一个像素点,如果是黑色,则找纹理图对应像素的A值设为0,如果是白色,A值设为250.
4、启用blend融合函数。
5、贴图,渲染

所得效果和图一一样。

24

主题

256

帖子

267

积分

中级会员

Rank: 3Rank: 3

积分
267
 楼主| 发表于 2005-10-12 14:38:00 | 显示全部楼层

Re: 求助:关于多纹理映射



  1. void CMainFrame::LoadTexture()
  2. //-----------------------------------------------------------------------------
  3. // Name: loadTexture()
  4. // Desc:
  5. //-----------------------------------------------------------------------------  
  6. {
  7.     AUX_RGBImageRec *pImage_RGB = auxDIBImageLoad( "texture0.bmp" );
  8.         AUX_RGBImageRec *pImage_alpha = auxDIBImageLoad( "texture1.bmp" );
  9.     unsigned char *pImage_RGBA = NULL;

  10.     if( pImage_RGB != NULL && pImage_alpha != NULL )
  11.     {
  12.         int imageSize_RGB  = pImage_RGB->sizeX * pImage_RGB->sizeY * 3;
  13.         int imageSize_RGBA = pImage_RGB->sizeX * pImage_RGB->sizeY * 4;

  14.         // allocate buffer for a RGBA image
  15.         pImage_RGBA = new unsigned char[imageSize_RGBA];

  16.         //
  17.         // Loop through the original RGB image buffer and copy it over to the
  18.         // new RGBA image buffer setting each pixel that matches the key color
  19.         // transparent.
  20.         //

  21.         int i, j;

  22.         for( i = 0, j = 0; i < imageSize_RGB; i += 3, j += 4 )
  23.         {
  24.         
  25.             pImage_RGBA[j+3] = pImage_alpha->data[i+0];   // If so, set alpha to fully transparent.
  26.             

  27.             pImage_RGBA[j]   = pImage_RGB->data[i];
  28.             pImage_RGBA[j+1] = pImage_RGB->data[i+1];
  29.             pImage_RGBA[j+2] = pImage_RGB->data[i+2];
  30.         }

  31.         glGenTextures( 1, &g_textureID_0 );
  32.         glBindTexture( GL_TEXTURE_2D, g_textureID_0 );
  33.         glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  34.         glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_NEAREST);

  35.         // Don't forget to use GL_RGBA for our new image data... we support Alpha transparency now!
  36.         glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, pImage_RGB->sizeX, pImage_RGB->sizeY, 0,
  37.                       GL_RGBA, GL_UNSIGNED_BYTE, pImage_RGBA );
  38.     }

  39.     if( pImage_RGB )
  40.     {
  41.         if( pImage_RGB->data )
  42.             free( pImage_RGB->data );

  43.         free( pImage_RGB );
  44.     }

  45.     if( pImage_RGBA )
  46.         delete [] pImage_RGBA;
  47. }
复制代码

24

主题

256

帖子

267

积分

中级会员

Rank: 3Rank: 3

积分
267
 楼主| 发表于 2005-10-12 14:43:00 | 显示全部楼层

Re:求助:关于多纹理映射

无论如何要多谢ms3d和所有给我回复的朋友,在你们的指点下我学到了许多。
希望哪位朋能给出最佳答案。

24

主题

256

帖子

267

积分

中级会员

Rank: 3Rank: 3

积分
267
 楼主| 发表于 2005-10-12 14:55:00 | 显示全部楼层

Re:求助:关于多纹理映射

In the first texture stage, load the hair color with a texture environment of GL_DECAL or GL_MODULATE (depending on whether you need to incorporate the vertex color). In the second texture stage, overwrite the fragment's alpha value with the mask texture using GL_REPLACE. The mask texture has to be stored as GL_ALPHA.

这是一个老外的回复,请看得明白的朋友帮忙看看。

73

主题

149

帖子

185

积分

注册会员

Rank: 2

积分
185
发表于 2005-10-12 20:02:00 | 显示全部楼层

Re:求助:关于多纹理映射

1.读取alpha texture到hair texture的alpha通道中;
2.打开alpha test。
That's OK.
这样简单多了,干嘛非要用多纹理?

2

主题

18

帖子

24

积分

注册会员

Rank: 2

积分
24
发表于 2005-10-13 10:29:00 | 显示全部楼层

Re:求助:关于多纹理映射

sm3d所说可以实现,但是在实际操作中对效率要求高的时候,有下面的问题
第一,如果纹理在显存中,读取将是一个非常慢的动作。显卡上行快,下行慢。
第二,RGB可能只有一张,但是alpha可能有很多张,如果每次都要做一次alpha操作,效率太低。如果用多纹理,可以省去这个开销。

关于楼主这个问题,在应用中非常常见,比如在地图上有一条石板小路。最有效的方法是一张RGB纹理和一张alpha通道。所以这个例子应该非常多。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-28 03:04

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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