- 浏览: 10917 次
最近访客 更多访客>>
最新评论
-
晴天16:
果然 退出360安全卫士之后 错误就不再出现了
关于Android4.0 emulator-arm.exe-应用程序错误,内存不能为"read"问题解决方法
OpenGL编程设置
11小时前
一.环境配置
由于微软公司为了推销自己的产品DirectX,击败OpenGL,因此现在的windows操作系统只支持OpenGL1.1版本,而现在的OpengGL版本已经发展到了3.1,并且只有2.0以上的版本才支持GLSL语言,所以我们必须对操作系统上的OpenGL进行升级,那么应该如何升级呢?实际上,下载OpenGL2.0以上的开发库是没用的,因为windows只支持1.1版本。所以,要想解决这个问题,只能使用OpenGL扩展。这里我建议(也是许多人建议的)大家使用GLEW扩展库,因为它使用起来较为简单。
第一步:下载GLEW库。网址:
http://glew.sourceforge.net/index.html
第二步:解压缩文件,将include文件夹内的所有头文件添加到VC98/INCLUDE/GL中,将lib文件夹内的所有文件添加到VC98/LIB中,再将bin文件夹内的所有dll文件添加到C盘windows/system32中,OK了,其他文件就不要管了。
第三步:新建工程,在工程-》设置-》link中添加opengl32.lib glu32.lib glew32s.lib
第四步:在stdAfx.h中添加如下语句:
#define GLEW_STATIC 1
#include (由于glew头文件中已经包含了对gl.h和glu.h的包含,因此这里没有必要include。
第五步:配置OpenGL基本环境,详见上一篇文章《基于MFC的opengl编程》。
第六步:在InitOpenGL函数中添加如下代码:
GLenum err=glewInit();//初始化glew
if(err!=GLEW_OK)
MessageBox("failed to init glew!");
第七步:完成。
二、建立并导入shader文件。
分别建立两个文本文件,将shader源码写入其中,并将名字分别设置为temp.vert和temp.frag。然后将这两个文件复制到工程所在的目录下。
temp.vert的内容如下:
uniform float CoolestTemp;
uniform float TempRange;
attribute float VertexTemp;
varying float Temperature;
void main(void)
{
Temperature=(VertexTemp-CoolestTemp)/TempRange;
gl_Position=gl_ModelViewProjectionMatrix*gl_Vertex;
}
temp.frag的内容如下:
uniform vec3 CoolestColor;
uniform vec3 HottestColor;
varying float Temperature;
void main(void)
{
vec3 color=mix(CoolestColor,HottestColor,Temperature);
gl_FragColor=vec4(color,1.0);
}
这两个shader的作用是定义三角形三个顶点的温度,并根据温度对颜色进行插值。
三、编写连接shader与opengl的函数 。
//获得shader文件中字符的个数。
int ShaderSize(char *filename)
{
FILE *fp;
int count;
fp=fopen(filename,"rt");
if(!fp)
MessageBox("error");
rewind(fp);
fseek(fp,0,SEEK_END);
count=ftell(fp);
rewind(fp);
fclose(fp);
return count;
}
//将shader文件中的代码读取到字符串中,并返回该字符串的指针。
GLchar *ReadShaderSource(char *filename, int len)
{
GLchar *shader;
shader=(GLchar*)malloc(sizeof(char)*(len+1));
FILE *fp;
memset(shader,0,len+1);
fp=fopen(filename,"rt+");
if(!fp)
MessageBox("error");
fseek(fp,0,SEEK_SET);
fread(shader,sizeof(char),len,fp);
fclose(fp);
return shader;
}
int InstallShaders( GLchar *Vertex, GLchar *Fragment)
{
GLint vertCompiled, fragCompiled; // status values
GLint linked;
// Create a vertex shader object and a fragment shader object
vertexShaderObject = glCreateShader(GL_VERTEX_SHADER);
fragmentShaderObject = glCreateShader(GL_FRAGMENT_SHADER);
// Load source code strings into shaders
glShaderSource(vertexShaderObject, 1, (const char **)&Vertex, NULL);
glShaderSource(fragmentShaderObject, 1, (const char **)&Fragment, NULL);
// Compile the brick vertex shader, and print out
// the compiler log file.
glCompileShader(vertexShaderObject);
glGetShaderiv(vertexShaderObject, GL_COMPILE_STATUS, &vertCompiled);
// Compile the brick vertex shader, and print out
// the compiler log file.
glCompileShader(fragmentShaderObject);
glGetShaderiv(fragmentShaderObject, GL_COMPILE_STATUS, &fragCompiled);
if (!vertCompiled || !fragCompiled)
MessageBox("error");
// Create a program object and attach the two compiled shaders
programObject = glCreateProgram();
glAttachShader(programObject, vertexShaderObject);
glAttachShader(programObject, fragmentShaderObject);
// Link the program object and print out the info log
glLinkProgram(programObject);
glGetProgramiv(programObject, GL_LINK_STATUS, &linked);
if (!linked)
MessageBox("error");
/* int infologlength;
int charswrriten;
char *infolog;
// Install program object as part of current state
glGetShaderiv(vertexShaderObject,GL_INFO_LOG_LENGTH,&infologlength);
infolog=(char*)malloc(infologlength);
glGetShaderInfoLog(vertexShaderObject,infologlength,&charswrriten,infolog);
MessageBox(infolog);
glGetShaderiv(fragmentShaderObject,GL_INFO_LOG_LENGTH,&infologlength);
infolog=(char*)malloc(infologlength);
glGetShaderInfoLog(fragmentShaderObject,infologlength,&charswrriten,infolog);
MessageBox(infolog);*/
//以上的代码被注释起来,作用是获得shader编译后的错误报告,用于调试,由于已经调试成功,这里就不需要这些代码了
glUseProgram(programObject);
// Set up initial uniform values
glUniform1f(glGetUniformLocation(programObject, "CoolestTemp"), 0.0f);
glUniform1f(glGetUniformLocation(programObject, "TempRange"), 1.0f);
glUniform3f(glGetUniformLocation(programObject, "CoolestColor"), 0.0, 0.0, 1.0);
glUniform3f(glGetUniformLocation(programObject, "HottestColor"), 1.0, 0.0, 0.0);
return 1;
}
将这三个函数添加到VIEW类当中。注意,InstallShaer函数中的vertexShaderObject fragmentShaderObject以及programObject是VIEW类下的成员变量,需要大家手动添加到view类中。这三个变量都是GLuint类型。
同时,在view类中添加vertexShaderSource和fragmentShaderSource这两个变量,用于接收ReadShaderSource函数返回的指针。这两个变量都是GLchar*型。
在函数InitializeOpenGL中添加如下代码:
vertexShaderSource=ReadShaderSource("temp.vert",ShaderSize("temp.vert"));
fragmentShaderSource=ReadShaderSource("temp.frag",ShaderSize("temp.frag"));
InstallShaders(vertexShaderSource,fragmentShaderSource);
这样的话,shader源码就被编译为机器代码,加载到显卡上从而成为了OpenGL状态的一部分。
四、编写OpenGL绘图函数。
void RenderScene()
{
glTranslatef(0.0,0.0,-3.0);
GLint tempLoc = glGetAttribLocationARB(programObject, "VertexTemp");
glBegin(GL_TRIANGLES);
glVertexAttrib1f(tempLoc, 0.0f);
glVertex3f(1.0f,0.0f,0.0f);
glVertexAttrib1f(tempLoc, 0.5f);
glVertex3f(-1.0f,0.0f,0.0f);
glVertexAttrib1f(tempLoc, 1.0f);
glVertex3f(0.0f,1.0f,0.0f);
glEnd();
glLoadIdentity();
}
将该函数添加到VIEW类下。
在Ondraw()函数下写入如下代码:
::glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
RenderScene();
::glFlush();
::SwapBuffers(m_pDC->GetSafeHdc());
五、运行程序
这时候,你就会看到一个彩色三角形出现在屏幕上了!
说明:如果你的显卡为集成显卡或显卡驱动版本太低,则无法运行这段程序。
MFC背景透明
BOOL SetLayeredWindowAttributes(
HWND hwnd, // handle to the layered window
COLORREF crKey, // specifies the color key
BYTE bAlpha, // value for the blend function
DWORD dwFlags // action
);
Windows NT/2000/XP: Included in Windows 2000 and later.
Windows 95/98/Me: Unsupported.
Header: Declared in Winuser.h; include Windows.h.
Library: Use User32.lib.
一些常量:
WS_EX_LAYERED = 0x80000;
LWA_ALPHA = 0x2;
LWA_COLORKEY=0x1
其中dwFlags有LWA_ALPHA和LWA_COLORKEY
LWA_ALPHA被设置的话,通过bAlpha决定透明度.
LWA_COLORKEY被设置的话,则指定被透明掉的颜色为crKey,其他颜色则正常显示.
注:要使使窗体拥有透明效果,首先要有WS_EX_LAYERED扩展属性(旧sdk也没有的).
在OnInitDialog()加入:
//加入WS_EX_LAYERED扩展属性
SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,
GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
HINSTANCE hInst = LoadLibrary("User32.DLL");
if(hInst)
{
typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);
MYFUNC fun = NULL;
//取得SetLayeredWindowAttributes函数指针
fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
if(fun)fun(this->GetSafeHwnd(),0,128【设置透明度值在0-255】,2);
FreeLibrary(hInst);
}
发表评论
-
WIN下用exp备份保存最近N天方案
2012-01-20 02:18 645WIN下用exp备份保存最近N天方案 2010年06月03日 ... -
[转]命令行创建快捷方式的批处理脚本
2012-01-20 02:18 1431[转]命令行创建快捷方式的批处理脚本 2010年10月27日 ... -
自动化测试规范小结
2012-01-20 02:18 706自动化测试规范小结 20 ... -
自动获取CPU使用率的脚本
2012-01-20 02:18 1346自动获取CPU使用率的脚本 2011年04月28日 一个 ... -
业务组件学习资料
2012-01-20 02:18 593业务组件学习资料 2011 ... -
红楼梦》室内空间艺术+古代门窗及家居装饰陈设+陈设和起居及其他。
2012-01-19 10:08 660红楼梦》室内空间艺术+古代门窗及家居装饰陈设+陈设和起居及其他 ... -
国学常识之风俗礼仪
2012-01-19 10:07 747国学常识之风俗礼仪 2011年08月07日 【伯(孟)仲 ... -
解读《三字经》(7)
2012-01-19 10:07 623解读《三字经》(7) ... -
八项十一处遗产
2012-01-19 10:07 499八项十一处遗产 2011年0 ... -
3.1 MFC概述
2012-01-17 02:48 5103.1 MFC概述 2009年12月01 ... -
关于Android4.0 emulator-arm.exe-应用程序错误,内存不能为"read"问题解决方法
2012-01-17 02:48 814关于Android4.0 emulator-arm.exe-应 ... -
sysytem32下的文件及其作用的文章
2012-01-17 02:48 552sysytem32下的文件及其作用的文章 2011年11月2 ... -
Window Phone 7 将如何发展,作为程序员的我们能看到吗?
2012-01-17 02:48 489Window Phone 7 将如何发展,作为程序员的我们能看 ... -
告别光棍有新法
2012-01-15 22:25 603告别光棍有新法 2011年02月28日 越 ...
相关推荐
MFC进行opengl编程设置 在VC环境下进行OPENGL的编程设置
OpenGL编程指南.pdf
OpenGL编程精粹.pdf
OpenGL 编程指南 第七版 源码 红宝书源码,未经任何修改
OpenGL编程指南第八版高清中文完整版 OpenGL编程指南第八版高清中文完整版
OpenGL编程进阶 OpenGL编程进阶 OpenGL编程进阶 OpenGL编程进阶
OpenGL编程指南 第8版 高清 中文 完整版,PDF格式的。是目前网络上最清晰的完整版本。这本书是学习OpenGl的必备资料,非常好的书。 由Khronos小组编写的官方指南,OpenGL领域的权威著作,素有“OpenGL红宝书”美誉...
完整的OpenGL编程指南第八版源代码,
OpenGL编程指南(第六版).pdf ),学习openGL必备
opengl编程指南第7版, 每个文件可以单独编译学习。看看书,研读一下代码,进步很快的哟!
OpenGL编程指南(第八版)源码 在csdn,同名账户下其他共享url下,可以浏览同名账户查找
OpenGL编程入门(Blue).pdf OpenGL编程入门(Blue).pdf OpenGL编程入门(Blue).pdf
OpenGL图形系统是一个软件接口,让程序员能够创建交互式程序,使用计算机图形学技术生成具有真实感...本书只要求读者有一定的C语言基础和数学知识,适合所有对OpenGL编程感兴趣的读者阅读。 注: 此文件大小为34MB
详细讲解了如何使用VC来实现OpenGL的编程步骤及代码
OpenGL编程指南第八版高清中文完整版,由于文件过大,分五部分上传,需要将五部分都下载后才可解压,资料绝对好用,之后我会将随书源码也上传
Opengl编程指南 第八版 源码.part1