#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. Windows 保存BMP图片

    在Windows下保存BMP图片还是挺方便的,直接上代码,拷贝就能用 void savebmp(uchar * pdata, char * bmp_file, int width, int heigh ...

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

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

  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. Clang 与 LLVM

    我们在iOS调试中经常会看到Clang这个,那么Clang到底是什么呢?我们来简单了解一下. Clang是一个C.C++.OC语言的轻量级编译器.源代码发布于BSD协议下.Clang是由C++编写,基 ...

  2. 移动web HTML5使用photoswipe模仿微信朋友圈图片放大浏览

    先来几张效果图: 点击其中一张照片可放大,可支持图片文字描述: 同时支持分享功能: 支持手势放大缩小 使用js框架是PhotoSwipe. PhotoSwipe是一个图片放大插件,兼容pc和移动端,经 ...

  3. 基于h5+ajax实现的手机定位

    因朋友需要,之前看了下关于h5的手机定位,目前写了个demo在这里贴出来,感兴趣的朋友可以看一下. 目前的版本只是demo,仍有几个问题需要完善一下,问题如下: 1,如何将经纬度等数据发送到被定位人看 ...

  4. python 处理cookie简单很多啊 httpclient版本是4.3.3

    模拟登录流程: 1 请求host_url 2 从host_url中解析出 隐藏表单 的值 添加到POST_DATA中 3 添加账户,密码到POST_DATA中 4 编码后,发送POST请求    要点 ...

  5. 因为中国队赢了,再撸一下DJANGO的官方文档吧

    对比一下,CBVS和FBVS,哪个方便? from django.shortcuts import render from django.http import Http404 from django ...

  6. Golang全接触

    满打满算, 从好友推荐Golang至发文时, 使用Golang已经有1年多了. 这种时间对于C/C++ Java这些老者来说, 简直是菜鸟级别的经验 但作为新生代语言的特点就是实战. Golang这一 ...

  7. 新API:AttachThreadInput

    https://msdn.microsoft.com/fr-fr/library/windows/desktop/ms681956(v=vs.85).aspx

  8. 以面到点的学习MFC

    市面上讲解学习MFC的书籍不胜其多,但是阅读的同学呢,看了一些内容以后,就无法阅读下去了,觉得MFC好难,有的呢,就会直接去看别人写的程序,不管是大或小,有时候也能明白一点点,但是总是走不出自己开发设 ...

  9. MST(prim)+树形dp-hdu-4756-Install Air Conditioning

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4756 题目意思: n-1个宿舍,1个供电站,n个位置每两个位置都有边相连,其中有一条边不能连,求n个 ...

  10. 【CF】196 Div.2 D. Book of Evil

    显然这个图是一课树,看着题目首先联想到LCA(肯定是可以解的).但是看了一下数据大小,应该会TLE.然后,忽然想到一个前面做过的题目,大概是在一定条件下树中某结点旋转成为根后查询最长路径.结果灵感就来 ...