- 浏览: 13932 次
最新评论
OpenGL编程设置
- 博客分类:
- 技术杂绘
OpenGL编程设置
13小时前
一.环境配置
由于微软公司为了推销自己的产品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);
}
发表评论
-
vbs脚本:ExplorerSel
2012-01-20 10:01 630vbs脚本:ExplorerSel 2010年08月09日 ... -
PowerDesigner设置MYSQL主键自动增长的方法
2012-01-20 10:01 838PowerDesigner设置MYSQL主键自动增长的方法 ... -
轻量级自动化测试框架解析
2012-01-20 10:01 862轻量级自动化测试框架解析 2010年06月22日 因为工 ... -
基于探测的Script (Event)SCOM 收集规则
2012-01-20 10:01 597基于探测的Script (Event)SC ... -
vbs脚本:CreateFolder
2012-01-20 10:01 420vbs脚本:CreateFolder 2010年08月09日 ... -
VC编译器配置及编译选项
2012-01-19 15:02 721VC编译器配置及编译选 ... -
WinCE驱动开发问题精华集锦
2012-01-19 15:02 550WinCE驱动开发问题精华 ... -
WinCE驱动开发问题精华集锦(一)
2012-01-19 15:02 553WinCE驱动开发问题精华 ... -
用MFC实现DLL文件注册
2012-01-19 15:02 819用MFC实现DLL文件注册 2010年08月05日 ... -
delphi中opengl程序设计
2012-01-17 04:47 515delphi中opengl程序设计 2011年06月07日 ... -
Opengl:显示中文改进版
2012-01-17 04:47 1095Opengl:显示中文改进版 2010年07月09日 由 ... -
转载:OpenGL显示文字
2012-01-17 04:47 700转载:OpenGL显示文字 2010年07月03日 本课 ... -
Android游戏开发(一)
2012-01-17 04:47 741Android游戏开发(一) 2011年03月08日 原 ... -
Vbs脚本应用――打造个性化QQ
2012-01-16 03:39 612Vbs脚本应用――打造个性化QQ 2009年07月16日 ... -
Iisweb.vbs:IIS 网站管理脚本详解(二)
2012-01-16 03:39 790Iisweb.vbs:IIS 网站管理脚本详解(二) 200 ... -
vbs脚本恶搞
2012-01-16 03:39 721vbs脚本恶搞 2009年08月07 ... -
把我最钟爱的脚本语言--vbs 的教程分享给大家--1
2012-01-16 03:39 705把我最钟爱的脚本语言- ... -
使用DevCom和VBS脚本一键开关双网卡
2012-01-16 03:39 1241使用DevCom和VBS脚本一键开关双网卡 2009年10月 ...
相关推荐
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