大家帮忙看下我的这个程序为什么不能实现图片的某部分透明?

blldw 2008-04-01 11:28:00
这个样子的,我想设置纹理的部分透明,在本例中就是让纹理中的紫色部分透明,只显示一个NPC,但是程序效果没有实现,大家看下有什么问题,谢谢了,附源代码?

#include <iostream>
#include <gl/glut.h>
#include <gl/GLAux.h>

#pragma comment(lib, "glaux.lib")

unsigned char *texture = NULL;

void init()
{
AUX_RGBImageRec *pImage = NULL;
pImage = auxDIBImageLoadA("pic\\NPC_02.BMP");
if (pImage == NULL)
{
std::cout << "error load npc_01.bmp" << std::endl;
return;
}

// the picture is a bitmap file, and it has no alpha channel, we
// create one for it
// save the rgb components of left-up corner pixel, which is to be set as alpha
unsigned char r = 0, g = 0, b = 0;
r = *(pImage->data), g = *(pImage->data + 1), b = *(pImage->data + 2);

// how many bytes does the texture with alpha channel require?
texture = new unsigned char[pImage->sizeX*pImage->sizeY*4];
// copy pixel
for (int i = 0; i < pImage->sizeX; i++)
for (int j = 0; j < pImage->sizeY; j++)
{
*(texture + i*pImage->sizeX*4 + j*4) = *(pImage->data + i*pImage->sizeX*3 + j*3); // r
*(texture + i*pImage->sizeX*4 + j*4 + 1)= *(pImage->data + i*pImage->sizeX*3 + j*3 + 1); // g
*(texture + i*pImage->sizeX*4 + j*4 + 2)= *(pImage->data + i*pImage->sizeX*3 + j*3 + 2); // b
if (*(pImage->data + i*3 + j*3) == r &&
*(pImage->data + i*3 + j*3 + 1) == g &&
*(pImage->data + i*3 + j*3 + 2) == b)
{
*(texture + i*pImage->sizeX*4 + j*4 + 3) = 0; // transparent
}
else
{
*(texture + i*pImage->sizeX*4 + j*4 + 3) = 255; // opacity
}
}

GLuint tex;
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);

// texture parameters
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
gluBuild2DMipmaps(GL_TEXTURE_2D, 4, pImage->sizeX, pImage->sizeY, GL_RGBA, GL_UNSIGNED_BYTE, texture);

glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
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);

free(pImage->data);

glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
}

void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();

glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.5f);

glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, -1.0f / 8.0f);
glVertex2i(-32, -32);
glTexCoord2f(1.0f / 8.0f, -1.0 / 8.0f);
glVertex2i(32, -32);
glTexCoord2f(1.0f / 8.0f, 0.0f);
glVertex2i(32, 32);
glTexCoord2f(0.0f, 0.0f);
glVertex2i(-32, 32);
glEnd();

glDisable(GL_ALPHA_TEST);
glDisable(GL_BLEND);
glDisable(GL_TEXTURE_2D);

glutSwapBuffers();
}

void resize(int width, int height)
{
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-96, 96, -96, 96);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutInitWindowSize(512, 512);
glutInitWindowPosition(0, 0);
glutCreateWindow("Alpha, Texturing, and Walk");

glutReshapeFunc(resize);
glutDisplayFunc(display);

init();
glutMainLoop();

// release memory
delete texture;

return 0;
}
...全文
73 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
meiZiNick 2008-05-01
  • 打赏
  • 举报
回复
lz要干嘛?

8,325

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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