C++ C++;OpenGL位图透明度问题
我从opengl纹理开始,一切都很好。现在我尝试加载bmp并使用glEnable(GL_BLEND)使白色部分透明;和glBlendFunc(GL_SRC_ALPHA,GL_ONE_减去GL_SRC_ALPHA) 这是我的源代码:C++ C++;OpenGL位图透明度问题,c++,opengl,bitmap,C++,Opengl,Bitmap,我从opengl纹理开始,一切都很好。现在我尝试加载bmp并使用glEnable(GL_BLEND)使白色部分透明;和glBlendFunc(GL_SRC_ALPHA,GL_ONE_减去GL_SRC_ALPHA) 这是我的源代码: float kSpeedForw=0.0f; GLuint texture[1]; CCamera g_Camera; GLfloat xrot = 0;
float kSpeedForw=0.0f;
GLuint texture[1];
CCamera g_Camera;
GLfloat xrot = 0;
GLfloat yrot = 0;
GLfloat zrot = 0;
bool g_bFullScreen = true;
HWND g_hWnd;
RECT g_rRect;
HDC g_hDC;
HGLRC g_hRC;
HINSTANCE g_hInstance;
float jump = -0.1;
GLfloat LightAmbient[] = { 0.5f, 0.5f, 0.5f, 1.0f };
GLfloat LightDiffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat LightPosition[] = { 0.0f, 0.0f, 2.0f, 1.0f };
void Init(HWND hWnd)
{
glEnable(GL_TEXTURE_2D); // Enable Texture Mapping
glShadeModel(GL_SMOOTH); // Enable Smooth Shading
glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // Black Background
glClearDepth(1.0f); // Depth Buffer Setup
glEnable(GL_DEPTH_TEST); // Enables Depth Testing
glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations
glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient); // Setup The Ambient Light
glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse); // Setup The Diffuse Light
glLightfv(GL_LIGHT1, GL_POSITION, LightPosition); // Position The Light
glEnable(GL_LIGHT1); // Enable Light One
glColor4f(1.0f, 1.0f, 1.0f, 0.5); // Full Brightness. 50% Alpha
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
g_hWnd = hWnd;
GetClientRect(g_hWnd, &g_rRect);
InitializeOpenGL(g_rRect.right, g_rRect.bottom);
g_Camera.PositionCamera(0, 1.5f, 6, 0, 1.5f, 5, 0, 1, 0);
ShowCursor(false);
}
GLuint LoadTexture(const char * filename)
{
glEnable(GL_TEXTURE_2D);
GLuint texture;
int width, height;
unsigned char * data;
FILE * file;
file = fopen(filename, "rb");
if (file == NULL) return 0;
if (filename=="Data/weed.bmp"){
width = 200;
height = 200;
}
if (filename == "Data/gun.bmp"){
width = 300;
height = 300;
}
data = (unsigned char *)malloc(width * height * 3);
fread(data, width * height * 3, 1, file);
fclose(file);
for (int i = 0; i < width * height; ++i)
{
int index = i * 3;
unsigned char B, R;
B = data[index];
R = data[index + 2];
data[index] = R;
data[index + 2] = B;
}
if (filename == "Data/weed.bmp"){
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, width, height, GL_RGB, GL_UNSIGNED_BYTE, data);
free(data);
}
if (filename == "Data/gun.bmp"){
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, 3,width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
}
return texture;
}
WPARAM MainLoop() // main function
{
MSG msg;
Init(g_hWnd);
glClearColor(0, 0, 255, 0);
while (1)
{
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else if (LockFrameRate(60))
{
g_Camera.SetViewByMouse();
kSpeedForw = 0;
if (jump > -0.1)jump-=0.01;
CheckForMovement();
g_Camera.MoveCamera(kSpeedForw, jump);
RenderScene();
}
}
DeInit();
return(msg.wParam);
}
void RenderScene()
{
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glDisable(GL_BLEND);
glEnable(GL_SMOOTH);
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(g_Camera.m_vPosition.x, g_Camera.m_vPosition.y, g_Camera.m_vPosition.z,
g_Camera.m_vView.x, g_Camera.m_vView.y, g_Camera.m_vView.z,
g_Camera.m_vUpVector.x, g_Camera.m_vUpVector.y, g_Camera.m_vUpVector.z);
GLuint texture;
texture = LoadTexture("Data/weed.bmp");
glBindTexture(GL_TEXTURE_2D, texture);
glBegin(GL_QUADS);
float i = 0;
glColor3f(1,1,1);
glTexCoord2f(0.0f, 0.0f);
glVertex3f(-10 + i / 5, 0, 10 - i / 5);
glTexCoord2f(50.0f, 0.0f);
glVertex3f(-10 + i / 5, 0, -10 + i / 5);
glTexCoord2f(50.0f, 50.0f);
glVertex3f(10 - i / 5, 0, -10 + i / 5);
glTexCoord2f(0.0f, 50.0f);
glVertex3f(10 - i / 5, 0, 10 - i / 5);
glEnd();
////////////////////////////////////////////////////////////HUD
glDisable(GL_LIGHTING);
glDisable(GL_TEXTURE_2D);
glDisable(GL_DEPTH_TEST);
glDisable(GL_SMOOTH);
glEnable(GL_BLEND); // Turn Blending On
int vPort[4];
glGetIntegerv(GL_VIEWPORT, vPort);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0, vPort[2], 0, vPort[3], -1, 1);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
GLuint ruka;
ruka = LoadTexture("Data/gun.bmp");
glBindTexture(GL_TEXTURE_2D, ruka);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f);
glVertex2f(0, 0);
glTexCoord2f(1.0f, 0.0f);
glVertex2f(450,0);
glTexCoord2f(1.0f, 1.0f);
glVertex2f(450,450);
glTexCoord2f(0.0f, 1.0f);
glVertex2f(0,450);
glEnd();
SwapBuffers(g_hDC);
}
float kSpeedForw=0.0f;
胶合纹理[1];
CCamera g_照相机;
GLROT=0;
glyrot=0;
GLZrot=0;
bool g_bFullScreen=true;
HWND g_HWND;
纠正错误;
HDC g_HDC;
HGLRC g_hRC;
欣坦丁·高欣坦丁;
浮动跳跃=-0.1;
GLfloat LightAmbient[]={0.5f,0.5f,0.5f,1.0f};
GLfloat LightDiffuse[]={1.0f,1.0f,1.0f,1.0f};
GLfloat LightPosition[]={0.0f,0.0f,2.0f,1.0f};
无效初始(HWND HWND)
{
glEnable(GL_纹理_2D);//启用纹理映射
glShadeModel(GL_平滑);//启用平滑着色
glClearColor(0.0f,0.0f,0.0f,0.5f);//黑色背景
glClearDepth(1.0f);//深度缓冲区设置
glEnable(GL_DEPTH_TEST);//启用深度测试
glDepthFunc(GL_LEQUAL);//要进行的深度测试类型
glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);//非常好的透视计算
glLightfv(GL_LIGHT1,GL_AMBIENT,LightAmbient);//设置环境光
glLightfv(GL_LIGHT1,GL_DIFFUSE,LightDiffuse);//设置漫反射光
glLightfv(GL_LIGHT1,GL_POSITION,LightPosition);//定位灯光
glEnable(GL_LIGHT1);//启用Light One
glColor4f(1.0f,1.0f,1.0f,0.5);//全亮度。50%阿尔法
glBlendFunc(GL_SRC_ALPHA,GL_ONE_减去GL_SRC_ALPHA);
g_hWnd=hWnd;
GetClientRect(g_hWnd和g_rect);
初始化英语(g_-errect.right,g_-errect.bottom);
g_摄像头位置摄像头(0,1.5f,6,0,1.5f,5,0,1,0);
ShowCursor(假);
}
GLuint LoadTexture(常量字符*文件名)
{
glEnable(GL_纹理_2D);
胶合结构;
int宽度、高度;
无符号字符*数据;
文件*文件;
file=fopen(文件名为“rb”);
如果(file==NULL)返回0;
如果(文件名==“Data/weed.bmp”){
宽度=200;
高度=200;
}
如果(文件名==“Data/gun.bmp”){
宽度=300;
高度=300;
}
数据=(无符号字符*)malloc(宽度*高度*3);
fread(数据,宽度*高度*3,1,文件);
fclose(文件);
对于(int i=0;i-0.1)跳跃-=0.01;
检查移动();
g_摄像头。移动摄像头(kSpeedForw,跳跃);
RenderScene();
}
}
脱硝();
返回(msg.wParam);
}
void RenderScene()
{
glMatrixMode(GL_投影);
glPopMatrix();
glMatrixMode(GLU模型视图);
glPopMatrix();
glDisable(GLU混合);
glEnable(Glu光滑);
glEnable(GLU深度试验);
glEnable(GL_纹理_2D);
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glLoadIdentity();
gluLookAt(g_Camera.m_vPosition.x,g_Camera.m_vPosition.y,g_Camera.m_vPosition.z,
g_Camera.m_vView.x,g_Camera.m_vView.y,g_Camera.m_vView.z,
g_Camera.m_vUpVector.x,g_Camera.m_vUpVector.y,g_Camera.m_vUpVector.z);
胶合结构;
纹理=加载纹理(“Data/weed.bmp”);
glBindTexture(GL_TEXTURE_2D,纹理);
glBegin(GL_QUADS);
浮点数i=0;
gl3f(1,1,1);
glTexCoord2f(0.0f,0.0f);
glVertex3f(-10+i/5,0,10-i/5);
glTexCoord2f(50.0f,0.0f);
glVertex3f(-10+i/5,0,-10+i/5);
glTexCoord2f(50.0f,50.0f);
glVertex3f(10-i/5,0,-10+i/5);
glTexCoord2f(0.0f,50.0f);
glVertex3f(10-i/5,0,10-i/5);
格伦德();
////////////////////////////////////////////////////////////抬头显示器
glDisable(GLU照明);
glDisable(GL_纹理_2D);
glDisable(GLU深度测试);
glDisable(GLU平滑);
glEnable(GL_混合);//启用混合
int-vPort[4];
GLGEINTEGERV(GL_视口,vPort);
glMatrixMode(GL_投影);
glPushMatrix();