现代opengl 程序中,都有一个着色器,我就想是不是可以有多个着色器呢?这样就催生了本文,2个着色器的例子。
一个着色器包含顶点着色器和片段着色器。本文介绍2个着色器的使用例子,一个是纹理贴图,一个只是简单的长方体。
下面先看看效果:
现在把2个着色器代码展示出来:
纹理图的顶点着色器:
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec2 aTexCoord;
out vec2 TexCoord;
uniform mat4 mvp;
void main()
{
gl_Position = mvp* vec4(aPos, 1.0f);
TexCoord = vec2(aTexCoord.x, aTexCoord.y);
}
纹理图的片段着色器:
#version 330 core
out vec4 FragColor;
in vec2 TexCoord;
uniform sampler2D texture1;
void main()
{
FragColor = texture(texture1, TexCoord);
}
立方体的 顶点着色器:
#version 330 core
layout (location = 0) in vec3 aPos;
uniform mat4 mvp;
void main()
{
gl_Position = mvp*vec4(aPos, 1.0);
}
立方体的 片段着色器:
#version 330 core
out vec4 FragColor;
uniform vec4 ourColor;
void main()
{
FragColor = ourColor;
}
可以看到2个实体有不同的着色需求,纹理的需要vec3, vec2, 而后者只要一个vec3。
其实使用也很简单,先构建2个着色器,分别得到2个id, 在程序中依次使用
glUseProgram(ourShader.ID);
glUseProgram(ourShader2.ID);
整个程序附录于后。需要编译链接运行的话,你需要安装GLFW, glad, glm。
GLFW, glad 的安装设置请看 现代opengl 设计入门 准备第一个工程
GLM是OpenGL Mathematics的缩写,它是一个只有头文件的库,也就是说我们只需包含对应的头文件就行了,不用链接和编译。GLM可以在它们的网站上下载。把头文件的根目录复制到你的includes文件夹,然后你就可以使用这个库了。
程序中还用到了shader_s.h 可以在这里下载,stb_image.h
可以在这里下载。
有了上面这些条件,建一个vc console工程,把下面代码复制过去就好了。还需要注意4个着色器文件的名字和路径要与程序一致,贴图文件你可以自己找个就好了,文件名和路径也要与程序中一致。也就是说程序中这5个文件的名字和路径要修改好。
程序在vc2010 上测试通过的,其他vc 应该也一样。
整个程序的代码也可以在我的网站www.liwensoft.com下载 , 但GLFW, glad不包括在内。
#include