游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1971|回复: 1

请教一个OPENGL做镂空材质的问题

[复制链接]

8

主题

41

帖子

41

积分

注册会员

Rank: 2

积分
41
发表于 2006-2-6 15:39:00 | 显示全部楼层 |阅读模式
请问:在OPENGL中运使材质镂空的关键因素有哪些呢?
为什么我在一个程序中已经成功绘制的平面树,移植到另外一个程序中确不好用了呢,困扰中……,


引用类似代码:就是《学OpenGL编3D游戏》书中的一段,

baiscobj::baiscobj()
{
           ……………………
        LoadT16("data/images/CACTUS0.BMP",g_cactus[11]);  
        glEnable(GL_TEXTURE_2D);
          ……………………

}

void baiscobj:oadT16(char *filename, GLuint &texture)
{
  glGenTextures(1, &texture);         
  glBindTexture(GL_TEXTURE_2D, texture);
  BITMAPINFOHEADER bitHeader;               
  unsigned char *buffer;            
  buffer=LoadBitmapFileWithAlpha(filename,&bitHeader);
  gluBuild2DMipmaps        ( GL_TEXTURE_2D,   
                                          4,               
                                          bitHeader.biWidth,
                                          bitHeader.biHeight,
                                          GL_RGBA,         
                                          GL_UNSIGNED_BYTE,  
                                          buffer         
                                        );         
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
  free(buffer);                          
}



void baiscobj::ShowTree(float x,float z,float h,float s,int cactus)
{
  glEnable(GL_BLEND);
  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  glEnable(GL_ALPHA_TEST);
  glAlphaFunc(GL_GREATER, 0);
  float mat[16];
  glGetFloatv(GL_MODELVIEW_MATRIX, mat);
  vector3_t X(mat[0], mat[4], mat[8]);
  vector3_t Z(mat[1], mat[5], mat[9]);
  glBindTexture(GL_TEXTURE_2D, g_cactus[cactus]);
  vector3_t pos(x,0.0,-z);
  pos.y = GetHeight(x, -z) + h + s;
  glBegin(GL_QUADS);
         glTexCoord2f(0.0,0.0);glVertex3fv((pos+(X+Z)*-h).v);//左下点
         glTexCoord2f(1.0,0.0);glVertex3fv((pos+(X-Z)* h).v);//右下点
         glTexCoord2f(1.0,1.0);glVertex3fv((pos+(X+Z)* h).v);//右上点
         glTexCoord2f(0.0,1.0);glVertex3fv((pos+(Z-X)* h).v);//左上点
  glEnd();
  glDisable(GL_ALPHA);
  glDisable(GL_BLEND);
}

除了这些还有没有什么关键的因素呢?
[em7] [em7] [em7] [em7]

6

主题

29

帖子

37

积分

注册会员

Rank: 2

积分
37
QQ
发表于 2006-2-8 12:56:00 | 显示全部楼层

Re:请教一个OPENGL做镂空材质的问题

镂空贴图主要取决于AlphaTest,在loadtexture时,强纹理设置成RGBA格式,将需要镂空的象素对应的ALPHA值设置成A,非镂空的象素ALPHA设置成B,且A<B,然后启用ALPHATEST,将ALPHATEST FUNC设置成GREAT通过
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-23 09:13

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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