【OpenGL学习笔记】着色器篇

一、图形渲染管线

在OpenGL中,所有事物都在3D空间中,而我们的屏幕是2D的,这导致OpenGL大部分工作都是在进行3D转2D。而这个过程是由OpenGL的图形渲染管线(Graphic Pipeline)管理的。图形渲染管线分以下几个阶段:

图形渲染管线

顶点数据:3D空间中顶点的坐标值
顶点着色器:实现顶点坐标系转换
形状(图元)装配:将顶点组装成指定图元形状
几何着色器:可添加新的顶点构造新的图元
光栅化:生成片段(指渲染一个像素所需所有数据)
片段着色器:计算顶点的输出颜色
测试与混合:进行深度,模板,混合等测试

二、着色器语言

为图形计算量身定制的语言 ( OpenGL Shading Language,GLSL),它和C语言很像,将在第四节详细讲解。下面是着色器的使用流程。

先了解一些概念
顶点着色器:描述如何绘制顶点的文件
片段着色器:描述如何绘制顶点颜色的文件
PS:通常我们将着色器写在独立的文件里,然后在主程序里动态加载和编译。

  • 顶点着色器

//版本号说明
#version 330 core
//layout (location = 0):是标记position位置 
//in关键字:输入变量
//vec3: 3分量向量
layout (location = 0) in vec3 position;
//程序入口
void main()
{
   
	//gl_Position: 预定义变量(不可修改),输出顶点
	//vec4: 4分量向量(第4个分量w不是用来表示空间的,咱玩的是3D不是4D)
	//w分量也叫做齐次坐标,简单来说是用来位移用的[矩阵运算]
    gl_Position = vec4(position.x, position.y, position.z, 1.0);
}
  • 片段着色器

//版本号说明
#version 330 core
//out关键字:输出变量
out vec4 color;

void main()
{
   
    color = vec4(1.0f, 0.5f, 0.2f, 1.0f);
}
  • 编译和链接着色器

现在我们写了最简单的顶点着色器和片段着色器,那么我们将如何使用它们呢。

----------------------   创建着色器   -----------------
//创建一个顶点着色器
GLuint vertexShader;
vertexShader = glCreateShader(GL_VERTEX_SHADER);
//加载和编译顶点着色器
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
glCompileShader(vertexShader);
//创建一个片段着色器
GLuint fragmentShader;
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
//加载和编译片段着色器
glShaderSource(fragmentShader, 1, &fragmentShaderSource, null);
glCompileShader(fragmentShader);

-----------------   glShaderSource解释   -----------------
//第一参数:着色器
//第二参数:指定了传递的源码字符串数量,这里只有一个。
//第三参数:是顶点着色器真正的源码(指上边写的GLSL)(char *类型)
//第四参数:我们先设置为NULL。

---------------------   获取编译信息  --------------------
GLint success;
GLchar infoLog[512];
//检测着色器编译是否成功
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);

if(!success)
{
   
	//获取错误信息
    glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
    //do someting...
}

------------------------  链接过程  --------------------
//创建着色器程序
GLuint shaderProgram;
shaderProgram = glCreateProgram();
//链接上边写的着色器
glAttachShader(shaderProgram, vertexShader);
glAttachShader
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值