《图形编程技术学习》(五十五)VS、FS的使用步骤
一、VS、FS的使用步骤1、配置glew
2、检测自己的机器的显卡是否支持VS、FS
3、撰写VS、FS的代码
4、装载、编译——链接VS、FS程序代码
5、使用VS、FS进行绘制
6、错误处理与清理
二、glew?
(1)glew:The OpenGL Extension Wrangler Library
(2)OpenGL核心库和实用库
核心库:gl.h,OpenGL32.lib,OpenGL32.dll
实用库:glu.h,glu32.lib,glu32.dll
(3)Freeglut库
freeglut.h等,freeglut.lib,freeglut.dll
(4)OpenGL的扩展机制
a,glext.h
b.glew:glew.h,glew32.lib,glew32.dll
(5)glew提供了所有扩展功能函数的接口。
三、Step1:配置glew
a.从http://glew.sourceforge.net/ 下载最新版本glew
目前最新版本是2.1.0[17-7-31发布
GLEW2.1.0提供了对OpenGL4.4所有扩展功能的支持。
b.对下载的glew工程进行编译链接生成lib和dll
c.将三类文件拷贝到相应目录下就完成了安装,具体而言,如果是32位版本,则:
(1)\include\GL中的所有.h文件(包括freeglut.h, glut.h, freeglut_ext.h, freeglut_std.h)拷贝到系统相应目录下。------如: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\GL
(2)\lib\x86中的freeglut.lib拷贝到:C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib
(3)\lib\x86中的freeglut.dll拷贝到 C:\Windows\SysWOW64\目录下
d.如果程序是64位版本,则需要编译得到64位的lib和dll,并拷贝到如下目录:
(1).h文件:同上面32位版本时的目录;
(2).lib文件:C:\Program Files (x86)\Microsoft Visual Studio
14.0\VC\lib\amd64
(3).dll文件:C:\Windows\System32\
e.注意事项
(1)在程序开始添加引用#include<GL/glew.h>
注意放在#include<GL/glut.h>之前。
(2)在工程中添加链接库glew32.lib,或者在程序中写:#pragma comment(lib,&#34;glew32.lib&#34;)
(3)调用glewInit()进行初始化。
四、检查显卡是否支持VS,FS
if(GLEW_ARB_vertex_shader && GLEW_ARB_fragment_shader)
printf(&#34;Ready for GLSL\n&#34;);
else
{
printf(&#34;Not totally read\n&#34;);
}
五、撰写VS,FS程序代码
方式1:直接写到一个字符串变量中
const GLchar* shaderSrc [] = {
&#34;void main()&#34;
&#34;{&#34;
&#34; gl_Position = gl_ModelViewProjectionMatrix *gl_Vertex;&#34;
&#34;}&#34;
};方式2:写到一个文本文件中,然后编程读此文件到一个字符串中。
六、装载——编译——链接VS,FS程序代码
两个重要概念
主要过程
a.创建着色器对象
b.将着色器源代码装载入此着色器对象
c.将源代码编译为目标代码
d.创建着色器程序
e.将着色器对象(可能是多个)附加到着色器程序中
h.链接着色器程序
参考链接: http://www.lighthouse3d.com/tutorials/glsl-tutorial/
七、使用VS,FS进行绘制
glUseProgram(G_shaderProgram);
glUseProgram(0);
八、错误处理
(1)调试shader很困难
(2)检查编译是否正确
glGetShaderiv(GLunit object,GLenum type,int *param);
type-GL_COMPILE_STATUS
(3)检查链接是否正确
glGetProgramiv(GLunit object,GLenum type,int *param);
type- GL_LINK_STATUS
(4)获取日志InfoLog
glGetShadeInfoLog(GLuint object,int maxLen,int *len,char*log);
glGetProgramInfoLog(GLunit object,int maLen,int *len,char *log);
九、清理
页:
[1]