Learn OpenGL(四)——片段着色器(Fragment Shader)

片段着色器(Fragment Shader)

       片段着色器是第二个也是最终我们打算创建的用于渲染三角形的着色器。 片段着色器的全部, 都是用来计算你的像素的最后颜色输出。 为了让事情比较简单, 我们的片段着色器只输出橘黄色。
 

注:
在计算机图形中颜色被表示为有4个元素的数组: 红色、 绿色、 蓝色和alpha(透明度)元素, 通常缩写为RGBA。

 

 

#version 330 core
out vec4 color;
void main()
{
color = vec4(1.0f, 0.5f, 0.2f, 1.0f);
}


片段着色器只需要一个输出变量, 这个变量是一个4元素表示的最终输出颜色的向量, 我们可以自己计算出来。 我们可以用 out 关键字声明输出变量, 这里我们命名为 color 。 下面, 我们简单的把一个带有alpha值为1.0(1.0代表完全不透明)的橘黄的 vec4 赋值给 color 作为输出。
编译片段着色器的过程与顶点着色器相似, 尽管这次我们使用 GL_FRAGMENT_SHADER 作为着色
器类型:

GLuint fragmentShader;
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentShaderSource, null);
glCompileShader(fragmentShader);


每个着色器现在都编译了, 剩下的事情是把两个着色器对象链接到一个着色器程序中(ShaderProgram), 它是用来渲染的。


着色器程序


着色器程序对象(Shader Program Object)是多个着色器最后链接的版本。 如果要使用刚才编译的着色器我们必须把它们链接为一个着色器程序对象, 然后当渲染物体的时候激活这个着色器程序。 激活了的着色器程序的着色器, 在调用渲染函数时才可用。
把着色器链接为一个程序就等于把每个着色器的输出链接到下一个着色器的输入。 如果你的输出和输入不匹配那么就会得到一个链接错误。创建一个程序对象很简单:

GLuint shaderProgram;
shaderProgram = glCreateProgram();



glCreateProgram 函数创建一个程序, 返回新创建的程序对象的ID引用。 现在我们需要把前面编译的着色器附加到程序对象上, 然后用 glLinkProgram 链接它们:

glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);


代码不言自明, 我们把着色器附加到程序上, 然后用 glLinkProgram 链接。

注:
就像着色器的编译一样, 我们也可以检验链接着色器程序是否失败, 获得相应的日志。 与glGetShaderiv和glGetShaderInfoLog不同
 

glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
if(!success) {
glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
...
}

 


我们可以调用 glUseProgram 函数, 用新创建的程序对象作为它的参数, 这样就能激活这个程序对象:

glUseProgram(shaderProgram);


现在在 glUseProgram 函数调用之后的每个着色器和渲染函数都会用到这个程序对象(当然还有
这些链接的着色器)了。
在我们把着色器对象链接到程序对象以后, 不要忘记删除着色器对象; 我们不再需要它们
了:

glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);


现在, 我们把输入顶点数据发送给GPU, 指示GPU如何在顶点和片段着色器中处理它。 还没结束, OpenGL还不知道如何解释内存中的顶点数据, 以及怎样把顶点数据链接到顶点着色器的属性上。 见下文(*╹▽╹*)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值