GLSL中的gl_Color在顶点着色器和片段着色器中的不同意义

本文解析了OpenGL着色器中的变量作用及其流转过程,包括顶点着色器和片元着色器中不同变量的功能区别。

转载请标明出处:http://blog.sina.com.cn/s/blog_41630e7e01008uu6.html


先来看看这2段代码
 
顶点着色器:
void main()
{
    gl_FrontColor = gl_Color;

    gl_Position = ftransform();
}

片元着色器:

void main()

     gl_FragColor = gl_Color;
}

 

2个都利用到了gl_Color,可是涵义是不同的

 

考虑最简单的流程:

内置属性变量->顶点处理器->内置易变变量->OpenGL固定功能->内置易变变量->片元处理器->输出变量

 

内置属性变量: gl_Color 就是属于这个,是应用程序传递给顶点处理器的值,类似的还有 gl_Normal gl_Vertex 等等

 

内置易变变量:顶点处理器对内置属性变量进行了某些操作后的输出值,而且这个值要交由片元处理器做进一步处理,例如本例子中的 gl_FrontColor 类似的例如 gl_BlackColor

 

内置易变变量:例如 gl_Color gl_Color 就是固定功能由 gl_FrontColor 和 gl_BlackColor 计算出来的结果

 

输出变量:片元处理器根据内置易变变量,进行某些计算后的输出例如本例中的gl_FragColor

 

因此 gl_Color 是内置属性变量,gl_Color 内置易变变量

虽然名字一样,可是涵义完全不同..


顶点着色器片段着色器是图形渲染管线中的重要组成部分,下面分别介绍它们的相关信息: ### 顶点着色器 - **介绍**:顶点着色器是图形渲染管线的第一个可编程阶段,主要用于处理顶点数据,如顶点位置、法线、颜色、纹理坐标等。它对每个输入的顶点执行一次,可完成顶点的变换、光照计算等操作。 - **原理**:顶点着色器接收顶点属性数据(如位置、法线等)、统一变量(如变换矩阵),通过一系列的计算(如矩阵乘法)对顶点的位置进行变换,将顶点从模型空间转换到裁剪空间。同时,还可以进行光照计算,将计算结果传递给后续阶段。 - **使用方法**:在定向灯的着色器示例中,顶点着色器的代码如下 [^2]: ```glsl attribute vec3 position; attribute vec3 normal; attribute vec4 color; uniform mat4 mvpMatrix; uniform mat4 invMatrix; uniform vec3 lightDirection; varying vec4 vColor; void main(void){ vec3 invLight = normalize(invMatrix * vec4(lightDirection, 0.0)).xyz; float diffuse = clamp(dot(normal, invLight), 0.1, 1.0); vColor = color * vec4(vec3(diffuse), 1.0); gl_Position = mvpMatrix * vec4(position, 1.0); } ``` 代码中,定义了顶点的位置、法线、颜色等属性,以及变换矩阵光照方向等统一变量。在 `main` 函数中,进行了光照计算顶点位置的变换。 ### 片段着色器 - **介绍**:片段着色器是图形渲染管线中处理片段(可以理解为像素)的可编程阶段,它接收顶点着色器传递过来的数据,对每个片段进行颜色计算。 - **原理**:片段着色器可以访问纹理,根据纹理坐标从纹理中采样颜色值,结合光照计算等因素,最终确定每个片段的颜色。 - **使用方法**:片段着色器拥有检索纹理的能力,对于 GPU 做通用计算(如数组排序、字符串检索等)必须使用到片段着色器。若已加载法线贴图并传递给片段着色器,可在其中将法线贴图的 RGB 值重新映射为三维法线向量进行光照计算 [^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值