openGL系列文章目录
前言
GLSL(OpenGL着色语言OpenGL Shading Language)语法跟C语言很类似,在可编程管线中我们必须要纯手写顶点和片源着色器,这里就要求必须使用GLSL,自行编译,链接,使用,本片文章介绍了GLSL基础语法。
可是调试GLSL很麻烦
一、glslang
glslangValidator是OpenGL标准定制官方Khronos Group定制的GLSL参考编译器,命令行编译模式方便了用户直接测试glsl语法而绕过C/C++的相关依赖库编译,也不需要在主文件编写大量初始化代码。这在实际测试中能节省大量时间,在很多网站如shadertoy,用户编写的glsl代码能够直接在主函数内编译运行,这时候需要方便的语法检查,shadertoy网站也提供了简单的语法检查,然而glslang由于是标准定制官方定制的编译器,从而编译通过的glsl代码在各种支持GLSL语法的驱动上都能正确通过编译。
1.glslang下载
2.使用git编译glslang
glslangValidator编译对不同功能的GLSL文件后缀名有要求:
编译glslang
要完成以下配置工作需要Windows预先配置好git和cmake。
创建新的目录,名为glslang,将github上下载的zip解压到该目录然后鼠标右击Git Bash Here
步骤1
步骤2
进入命令行后分别输入如下命令:
1.git clone https://github.com/KhronosGroup/glslang.git
2.mkdir -p build
3.cd build
4.git config --global core.fileMode false
5.cmake …/glslang -DCMAKE_INSTALL_PREFIX="$(pwd)/install"
6.cmake --build . --config Release --target install
然后build文件夹下会生成很多文件,进入build/install/bin会看到这两个exe文件
并且生成 glslang.sln工程
glslang测试
#version 430
/**/
layout (location = 0) in vec3 vertPos;
layout (location = 1) in vec3 vertNormal;
out vec4 varyingColor;
struct PositionalLight
{ vec4 ambient;
vec4 diffuse;
vec4 specular;
vec3 position;
};
struct Material
{ vec4 ambient;
vec4 diffuse;
vec4 specular;
float shininess;
};
uniform vec4 globalAmbient;
uniform PositionalLight light;
uniform Material material;
uniform mat4 mv_matrix;
uniform mat4 proj_matrix;
uniform mat4 norm_matrix;
void main(void)
{ vec4 color;
// convert vertex position to view space
vec4 P = mv_matrix * vec4(vertPos,1.0);
// convert normal to view space
vec3 N = normalize((norm_matrix * vec4(vertNormal,1.0)).xyz);
// calculate view-space light vector (from point to light)
vec3 L = normalize(light.position - P.xyz);
// view vector is negative of view space position
vec3 V = normalize(-P.xyz);
// R is reflection of -L around the plane defined by N
vec3 R = reflect(-L,N);
// ambient, diffuse, and specular contributions
vec3 ambient =
((globalAmbient * material.ambient)
+ (light.ambient * material.ambient)).xyz;
vec3 diffuse =
light.diffuse.xyz * material.diffuse.xyz
* max(dot(N,L), 0.0);
vec3 specular =
pow(max(dot(R,V), 0.0f), material.shininess)
* material.specular.xyz * light.specular.xyz;
// send the color output to the fragment shader
varyingColor = vec4((ambient + diffuse + specular), 1.0);
// send the position to the fragment shader, as before
gl_Position = proj_matrix * mv_matrix * vec4(vertPos,1.0);
return 0;
}
这里我故意在main中加了“return 0;” 语句
使用命令:glslangValidator vertSehader.vert