大家帮忙看下我的这个程序为什么不能实现图片的某部分透明?
#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;
}
相关推荐
纯css实现背景图片半透明内容不透明的方法
前言 最近做一个登陆界面的,突然想使用这种背景图片透明,而内容不透明的效果,这里我就说一说我的两个思路吧。 效果展示 半透明 不透明 常见的失败做法 最常见的做法事设置元素的opacity,这种设置出来的效果就是内容与背景都事半透明的,严重影响视觉效果。 还有就是设置background-color:rgba(),这种方式只能设置背景颜色的透明度。 正确姿势 我想到两个方法,第一个就是利用伪元素::before,我们通过给伪元素添加背景并且将伪元素的设置伪元素的背景透明度来实现 <!DOCTYPE html> <html lang="en"> <head> <meta cha
实现任意形状的透明图片处理技术
通过本章节的介绍,我们理解了颜色透明化的理论基础和在图像处理中的重要性。我们还讨论了不同方法实现指定颜色透明化的优劣,并提供了如何在图像编辑软件中选择与配置工具的实际建议。在下一章中,我们将深入探讨颜色键技术原理及其在图像透明效果中的应用。选区工具是图形编辑软件中不可或缺的功能之一,它允许用户精确地选择图像中的一个特定区域。根据选择的方式,常用的选区工具可以分为矩形选区、椭圆形选区、套索工具、磁性套索以及魔棒工具等。每种工具都有其独特之处,而熟练掌握它们将为你的图像编辑工作带来巨大的灵活性。
C#图片半透明、完全透明及指定颜色透明
你只要有一个图片,便可以你这张图片加个背景图片,并让这个图片半透明、完全透明、或指定颜色透明。你可以用这个做一个有背景颜色的,很酷的2维码哦!
CSS实现背景图片透明而文字不透明效果的两种方法
主要介绍了CSS实现背景图片透明而文字不透明效果的两种方法,需要的朋友可以参考下
js把图片的背景变透明
图片的背景变透明不是为了酷,而是实际开发工作的需要。在web开发中,经常在网页上添加图片,如果图片的背景与网页的背景不同,会非常难看。如果图片的背景是透明的,那么无论网页的背景是什么,图片的背景是看不到的,图片完全与网页容为一体。 用到的知识有:html5、canvas的属性与方法,这些都自己补充吧。 注意点:下面的例子需要在服务器上,或者开发平台上运行,不能在本地机一个简单的网页中运行,否则会出现跨域访问的错误。代码如下:


