#include <windows.h>
#include <GL/glut.h>
#include <GL/glaux.h>
#include <stdio.h>

#pragma comment( lib, "opengl32.lib" )// 链接时使用OpenGL32.lib
#pragma comment( lib, "glu32.lib" )// 链接时使用GLu32.lib 
#pragma comment( lib, "glaux.lib" ) // 链接时使用GLaux.lib

HWND hWnd;
HDC hDC;
HGLRC hRC=NULL;//定义渲染环境
HINSTANCE hInstance;//得到程序的样例
RECT rect;

int sw = 600;
int sh = 600;

GLfloat aspect;
GLfloat x1=0.0;
GLfloat y1=0.0;
GLfloat xrot;// X轴旋转
GLfloat yrot;// Y轴旋转
GLfloat z=8.0;// 移入屏幕的深度
GLfloat x=0.0;
GLfloat y=0.0;

int LastXPos;
int LastYPos;

bool IsLBDown;
bool light;//光源-开/关
bool lp;//L键是否按下?

GLfloat LightAmbient[]= { 0.5f, 0.5f, 0.5f, 1.0 }; //环境光的值
GLfloat LightDiffuse[]= { 1.0, 1.0, 1.0, 1.0 }; //散射光的值
GLfloat LightPosition[]={ 0.0, 0.0, 2.0, 1.0 }; //光照位置

GLubyte Pixel;

GLuint texture[8];//纹理的存储空间

AUX_RGBImageRec *TextureImage[8];//为纹理创建存储空间

int LoadGLTextures(int i,char *FileName)//调用Bitmap并转换成纹理
{
unsigned char *m_ucpData;
  unsigned int x,y,width,height;
unsigned char tempRGB;
unsigned char *buffer;
FILE *fp;
int Status=FALSE;//状态确定
//-------------------------------读取位图,检查错误。假设位图不存在则退出
if(TextureImage[i]=auxDIBImageLoad(FileName))
{
width=TextureImage[i]->sizeX; 
height=TextureImage[i]->sizeY;
Status=TRUE;//将Status设为TRUE
fp=fopen(FileName,"a+b");
if(!fp){
fclose(fp);
return false;
}
//----------------------------读取图片RGB信息
m_ucpData=(unsigned char *)malloc(width*height*3);
fseek(fp,54,SEEK_SET);//指针跳过文件头移动到指定位置
fread(m_ucpData,sizeof(unsigned char),width*height*3,fp);//从指定位置读数据
for (int imageIdx = 0; imageIdx < (width*height*3); imageIdx+=3)
{
tempRGB = m_ucpData[imageIdx];
m_ucpData[imageIdx] = m_ucpData[imageIdx + 2];
m_ucpData[imageIdx + 2] = tempRGB;
}
//-----------------------------将RGB改动成RGBA
buffer = (unsigned char *)malloc(width*height*4);
for(x=0,y=0; x<(width*height*3); x+=3,y+=4)
{
buffer[y] = m_ucpData[x];
buffer[y+1] = m_ucpData[x+1];
buffer[y+2] = m_ucpData[x+2];
if(m_ucpData[x]==255 && m_ucpData[x+1]==255 && m_ucpData[x+2]==255)
{
buffer[y+3] = 0;
}
else
buffer[y+3] = 1;
}
//改动过的RGBA内容回写到TextureImage[i]
TextureImage[i]->data = (unsigned char *)realloc(TextureImage[i]->data,width*height*4);
for(int a=0;a<width*height*4;a++)
{
TextureImage[i]->data[a] = buffer[a];
if((a+1)%4==1)
{
int u=TextureImage[i]->data[a];
}
}

glGenTextures(1, &texture[i]);//命名一个纹理
glBindTexture(GL_TEXTURE_2D, texture[i]);//创建纹理对象
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);//制定纹理的包装形式,指定颜色线形过滤
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST); //MipMapped过滤
gluBuild2DMipmaps(GL_TEXTURE_2D,3,width,height,GL_RGBA,GL_UNSIGNED_BYTE,TextureImage[i]->data);//把纹理缩放到适合大小 
}
else
{
if (TextureImage[i])//纹理是否存在
{
if (TextureImage[i]->data)
{
free(TextureImage[i]->data);//释放纹理图象所占用内存
}
else free(TextureImage[i]);//释放图象结构
}
else return Status;
}
fclose(fp);
  delete buffer;
return Status;
}
void SceneInit(int w, int h)
{
LoadGLTextures(1,"obj_1.bmp");

glEnable(GL_TEXTURE_2D);

glEnable(GL_ALPHA_TEST); //透明部分測试
glAlphaFunc(GL_GREATER,0.5);

glEnable(GL_BLEND);//启用混合
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);

glShadeModel(GL_SMOOTH);//同意平滑着色
glClearColor( 0.0, 0.0, 0.0, 0.0);
}
void SceneResizeViewport(GLsizei w, GLsizei h)
{
if(h==0) 
{
h=1;
}
aspect = (GLfloat)w/(GLfloat)h;
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);//选择投影矩阵
glLoadIdentity();//重置
gluPerspective( 45.0, aspect, 0.1f, 100.0 );//设置透视,以45度角
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

}

void SceneShow(GLvoid)//这里进行全部的画图工作
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清屏和清除深度缓冲区
glLoadIdentity();//重置当前Modelview矩阵
gluLookAt(x,y,z,x1,y1,-2.0,0.0,1.0,0.0);

glBindTexture(GL_TEXTURE_2D, texture[1]);  
glBegin(GL_QUADS);
glNormal3f( 0.0, 0.0, 1.0);
glTexCoord2f(1.0, 0.0); glVertex3f(-0.5, -1.0, 2.0);
glTexCoord2f(1.0, 1.0); glVertex3f(-0.5, 0.0, 2.0);
glTexCoord2f(0.0, 1.0); glVertex3f( 0.5, 0.0, 2.0);
glTexCoord2f(0.0, 0.0); glVertex3f( 0.5, -1.0, 2.0);
glEnd();

glFlush();
}
//创建OPENGL窗体
void EnableOpenGL()
{
PIXELFORMATDESCRIPTOR pfd;
int iFormat;

hDC = GetDC( hWnd );

ZeroMemory( &pfd, sizeof( pfd ) );
pfd.nSize = sizeof( pfd );
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW |
PFD_SUPPORT_OPENGL |
PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 32;
pfd.cDepthBits = 32;
pfd.iLayerType = PFD_MAIN_PLANE;

iFormat = ChoosePixelFormat( hDC, &pfd );

SetPixelFormat( hDC, iFormat, &pfd );

hRC = wglCreateContext( hDC );
wglMakeCurrent( hDC, hRC );
}
void DisableOpenGL()
{
wglMakeCurrent( NULL, NULL );
wglDeleteContext( hRC );
ReleaseDC( hWnd, hDC );
}
LRESULT CALLBACK WndProc( HWND hWnd, UINT message,WPARAM wParam, LPARAM lParam )
{
switch ( message )
{
case WM_CREATE:  
GetWindowRect(hWnd, &rect);
sw = rect.right - rect.left;
sh = rect.bottom - rect.top;
SceneResizeViewport(sw, sh);
return 0;
case WM_SIZE://改变窗体的尺寸
GetWindowRect(hWnd, &rect);
sw = rect.right - rect.left;
sh = rect.bottom - rect.top;
if(sw>0 && sh>0)
SceneResizeViewport(sw, sh);
return 0;
default:
return DefWindowProc( hWnd,message, wParam, lParam );
}
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
  WNDCLASS wc;
MSG msg;
bool bQuit = false;
wc.style = CS_OWNDC;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
wc.hCursor = LoadCursor( NULL, IDC_ARROW );
wc.hbrBackground = (HBRUSH)GetStockObject( BLACK_BRUSH );
wc.lpszMenuName = NULL;
wc.lpszClassName = "Name";
RegisterClass( &wc );
hWnd = CreateWindow("Name","Animation Tech_Base on 2D Images",
WS_TILEDWINDOW | WS_VISIBLE,
GetSystemMetrics( SM_CXSCREEN )/2-sw/2,
GetSystemMetrics( SM_CYSCREEN )/2-sh/2,
sw,sh,NULL,NULL,hInstance,NULL );
ChangeDisplaySettings(NULL, 0);
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
EnableOpenGL();
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
SceneInit(sw, sh);
GetWindowRect(hWnd, &rect);
sw = rect.right - rect.left;
sh = rect.bottom - rect.top;
if(sw>0 && sh>0)
SceneResizeViewport(sw, sh);
while ( !bQuit )
{
if ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
if ( msg.message == WM_QUIT )
bQuit = true;
else 
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
{
// OpenGL 动画
SceneShow();
SwapBuffers(hDC);//重绘函数
}
}
//关闭,退出程序
DisableOpenGL();
ShowWindow (hWnd, SW_HIDE);
DestroyWindow( hWnd );
ChangeDisplaySettings(NULL, 0);
return msg.wParam;
return 0;

}

这是程序源码,在LoadGLTextures()函数里面
已经对图片的每一个象素进行读取,加入alpha通道,并回写到缓存里面,但是最后调用输出图片的时候却没有实现
debug的时候确定每一个象素点的alpha通道都按要求改动了...
请问大侠们我的问题到底出在哪里了?

关于Opengl中将24位BMP图片加入一个alpha通道并实现透明的问题的更多相关文章

  1. 关于Opengl中将24位BMP图片加入�一个alpha通道并实现透明的问题

    #include <windows.h>#include <GL/glut.h>#include <GL/glaux.h>#include <stdio.h& ...

  2. 24位和8位BMP图片保存纯C代码

    BMP图片大家都知道,可以通过查看BMP图片结构使用纯C就可以打开,编辑,处理,保存图片.非常方便使用. 具体BMP结构可以参考:wingdi.h头文件.今天主要在进行删减代码,需要把多余的代码删除, ...

  3. Android系统移植与调试之------->如何使用PhotoShop转换24位的bmp图片为16位bmp图片

    使用Android移植时候,很多图片都需要16为的bmp格式,所以研究了一下如何从24位转换成16位,供大家参阅 step1:查看bmp图片的属性,如下图所示,是24位的 step2:用PhotoSh ...

  4. 颜色模式中8位,16位,24位,32位色彩是什么意思?会有什么区别?计算机颜色格式( 8位 16位 24位 32位色)<转>

    颜色模式中8位,16位,24位,32位色彩是什么意思?会有什么区别简单地说这里说的位数和windows系统显示器设置中的颜色位数是一样的.表示的是能够显示出来的颜色的多少. 8位的意思是说,能够显示出 ...

  5. BMP图片格式模型(2)

    因为公司的主要业务是图像识别相关的,因此对图像处理.识别是我学习的重点.虽然写程序也不少年了,但是对于图像处理领域,我还是一个新兵.对很多基础的概念也还是存在盲区,所以想在边学边做的过程中,对一些概念 ...

  6. BMP 图片格式

     BMP根据颜色深度,可以分为2(1位).16(4位).256(8位).65536(16位)和1670万(24位)以及32位含有alpha通道.8位图像可以是 索引彩色图像外,也可以是灰阶图像,而索引 ...

  7. 读取bmp图片数据

    public void getBMPImage(String source) throws Exception { clearNData(); //清除数据保存区 FileInputStream fs ...

  8. linux 下使用opengl的glut库显示和旋转BMP图片

    效果图: 这里显示的图和原图有明显的色差,目前猜测是opengl渲染时的颜色表顺序跟BMP文件里的颜色表顺序相反导致. BMP里应该是BGRBGRBRG... ,而opengl渲染时应该是按照RGBR ...

  9. opengl打开本地bmp图片绘制

    注意bmp图片的格式问题,32位ARGB  或者24位RGB.你所采用的素材一定要注意是多少位的就用多少位的.否则会显示错误的图片或者其他什么的错误. 代码如下 32位版本 #include < ...

随机推荐

  1. 机器学习笔记(三)- from Andrew Ng的教学视频

    week four: Non-linear hypotheses:Neural Networks -->x1 and x2 x1 XNOR x2 ->a1->x1 and x2;a2 ...

  2. BZOJ 1270: [BeijingWc2008]雷涛的小猫( dp )

    简单的dp.. dp(i,j) = max(dp(x,y))+cnt[i][j], (x,y)->(i,j)是合法路径. 设f(i)= max(dp(x,y))(1≤x≤N, 1≤y≤i), g ...

  3. ListView判断滑动底部

    通过实现OnScrollListener这个接口,然后复写 public abstract void onScroll (AbsListView view, int firstVisibleItem, ...

  4. javascript面向对象创建高级 Web 应用程序

       目录 JavaScript 对象是词典 JavaScript 函数是最棒的 构造函数而不是类 原型 静态属性和方法 闭包 模拟私有属性 从类继承 模拟命名空间 应当这样编写 JavaScript ...

  5. django-crispy-forms入门指南

    django-crispy-forms 是对django form在html页面呈现方式进行管理的一个第三方插件. 配置: 在INSTALLED_APPS中加入'crispy_forms' djang ...

  6. LGPL与闭源程序

    最近一直在学习 Qt.Qt 有两个许可证:LGPL 和商业协议.这两个协议在现在的 Qt 版本中的代码是完全一致的(潜在含义是,Qt 的早期版本,商业版的 Qt 通常包含有一些开源版本所没有的库,比如 ...

  7. Directshow 通过 put_Owner 指定显示窗口后,自动刷新问题

    在Directshow中,我们可以对render指定显示窗口,在写程序的过程中, 发现通过put_Owner设置的显示窗口存在自动刷新问题,譬如窗口被遮挡然后再次露出时,被遮挡部分不能自动刷新,需要拖 ...

  8. OKR 方法 学习笔记

    最近公司兴起了对OKR这个词的讨论,并且听到时总会伴随提到KPI,提到绩效考核.那OKR到底是什么呢?与KPI的区别在哪里?与绩效考核有什么关系?它与我们现在推行的敏捷开发有啥关系呢?因此,就到网上查 ...

  9. 转:Javascript的10个设计缺陷

    作者: 阮一峰 日期: 2011年6月30日 前几篇文章,我经常说Javascript的设计不够严谨,有很多失误. 今天的这一篇,前半部分就谈为什么会这样,后半部分将列举Javascript的10个设 ...

  10. 基于visual Studio2013解决算法导论之046广度优先搜索

     题目 广度优先搜索 解决代码及点评 // 图的邻接表表示.cpp : 定义控制台应用程序的入口点. // #include <iostream> #include <stac ...