如何在OpenGl实现透明纹理贴图?

xddll 2001-08-03 09:33:05
...全文
1605 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ruixp 2001-10-12
  • 打赏
  • 举报
回复
用图像软件把透明的地方全改成一种单一的颜色,如上面的白色
ruixp 2001-10-12
  • 打赏
  • 举报
回复
void CVCITYView::DrawTree()//绘制树
{
/////////////////////////////
/////////画树程序////////////
/////////////////////////////
CTree tree;
tree.getTree(tree);

AUX_RGBImageRec* myimage;
unsigned char *image;
myimage=auxDIBImageLoad("tree1.bmp");
//makeTexture(myimage);
int width,height;
width=myimage->sizeX;
height=myimage->sizeY;
FILE *fp;
fp=fopen("tree1.bmp","rb");
if(!fp) return;
fseek(fp,54,SEEK_SET);////读取24位真彩色位图
image=(unsigned char *)malloc(width*height*3);
int rc;
rc=fread(image,sizeof(unsigned char),width*height*3,fp);
fclose(fp);
BYTE texture[256][256][4];//注意:每个像素占用4个字节,不是原来的3个。
for(int i=0;i<width;i++)
{
for(int j=0;j<height;j++)
{
//把颜色值写入
texture[i][j][0] = (GLubyte)*(image+i*width*3+j*3);
texture[i][j][1] = (GLubyte)*(image+i*width*3+j*3+1);
texture[i][j][2] = (GLubyte)*(image+i*width*3+j*3+2);
//设置alpha值,假设白色为透明色
if(texture[i][j][0]==255 && texture[i][j][1]==255 && texture[i][j][2]==255)
texture[i][j][3] = 0;//透明,设为 0
else
texture[i][j][3] = 255;//不透明,设为 255, 也就是以后用的1.0
}
}

//映射纹理
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
glTexImage2D(GL_TEXTURE_2D,0,4,width,height,0, GL_RGBA, GL_UNSIGNED_BYTE,texture);
gluBuild2DMipmaps(GL_TEXTURE_2D,4,width,height,GL_RGBA,GL_UNSIGNED_BYTE,texture);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER ,0.9);//0.5可以换成任何在0~1之间的数
for(i=1;i<198;i++)
{
glBegin(GL_QUADS);
glTexCoord2d(0,0);
glVertex3d(tree.TreePoint[i].x-0.5,tree.TreePoint[i].y,0.0);
glTexCoord2d(1,0);
glVertex3d(tree.TreePoint[i].x+0.5,tree.TreePoint[i].y,0.0);
glTexCoord2d(1,1);
glVertex3d(tree.TreePoint[i].x+0.5,tree.TreePoint[i].y,3);
glTexCoord2d(0,1);
glVertex3d(tree.TreePoint[i].x-0.5,tree.TreePoint[i].y,3);
glEnd();
}
glDisable(GL_TEXTURE_2D);
glDisable(GL_ALPHA_TEST);
glDisable(GL_BLEND);
}
ruixp 2001-08-03
  • 打赏
  • 举报
回复
上清华bbs的虚拟现实技术版看看
有一段代码
我写的,关于画树
ruixp 2001-08-03
  • 打赏
  • 举报
回复
先要将图的alpha值设置一下,即将透明的地方先用但一色表示,然后遇到该颜色
则将其alpha值设为1,其他可以保持不变
这样就可以在opengl夏读入了,注意激活融合
xddll 2001-08-03
  • 打赏
  • 举报
回复
唉....................................................
xddll 2001-08-03
  • 打赏
  • 举报
回复
没人知道?
xddll 2001-08-03
  • 打赏
  • 举报
回复
ruixp:
能不能给我发一个,xddll@sina.com
谢谢
xddll 2001-08-03
  • 打赏
  • 举报
回复
ruixp:
能不能给我发一个,xddll@sina.com
谢谢

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧