GPU上的小程序——着色器

本文章仅用于记录学习情况,资料来源LearnOpenGL CN

 

数据类型

GLSL有向量(Vector)、矩阵(Matrix)两种容器类型,此处先学习向量。

向量

一个向量可以包含2、3或4个分量,分别使用.x、.y、.z和.w来获取第1、2、3、4个分量。

 重组

vec2 someVec;

vec4 differentVec = someVec.xyxx;

vec3 anotherVec = differentVec.zyw;

vec4 otherVec = someVec.xxxx + anotherVec.yxzy;

例:vec2 vect = vec2(0.5, 0.7);

       vec4 result = vec4(vect, 0.0, 0.0);   //即:vec4(0.5,0.7,0.0,0.0)

       vec4 otherResult = vec4(result.xyz, 1.0);   //即:vec4(0.5,0.7,0.0,1.0)

输入(in)、输出(out)

//顶点着色器
#version 330 core 
layout (location = 0) in vec3 aPos;   //位置变量的属性位置值为0 
out vec4 vertexColor;   //为片段着色器指定一个颜色输出 
void main() { 
    gl_Position = vec4(aPos, 1.0);   //注意我们如何把一个vec3作为vec4的构造器的参数
    vertexColor = vec4(0.5, 0.0, 0.0, 1.0);   //把输出变量设置为暗红色 
}
//片段着色器
#version 330 core 
out vec4 FragColor; 
in vec4 vertexColor;   //从顶点着色器传来的输入变量(名称相同、类型相同) 
void main() { 
    FragColor = vertexColor; 
}

Uniform

Uniform是一种从CPU中的应用向GPU中的着色器发送数据的方式,是全局的。

#version 330 core 
out vec4 FragColor; 
uniform vec4 ourColor;   //在OpenGL程序代码中设定这个变量 
void main() { 
    FragColor = ourColor; 
}
......
//渲染循环中
float timeValue = glfwGetTime();   //获取秒数
float greenValue = (sin(timeValue) / 2.0f) + 0.5f;   //让颜色在0.0到1.0之间改变并将结果储存在greenValue中
int vertexColorLocation = glGetUniformLocation(shaderProgram, "ourColor");   //查询uniform ourColor的位置值
glUseProgram(shaderProgram);   //激活着色器程序
glUniform4f(vertexColorLocation, 0.0f, greenValue, 0.0f, 1.0f);   //设置uniform ourColor的值,在此之前需先激活着色器程序
......

 

更多属性

//顶点着色器
#version 330 core 
layout (location = 0) in vec3 aPos;   //位置变量的属性位置值为 0 
layout (location = 1) in vec3 aColor;   //颜色变量的属性位置值为 1 
out vec3 ourColor;   //向片段着色器输出一个颜色 
void main() { 
    gl_Position = vec4(aPos, 1.0); ourColor = aColor;   //将ourColor设置为我们从顶点数据那里得到的输入颜色 
}
//片段着色器
#version 330 core 
out vec4 FragColor; 
in vec3 ourColor; 
void main() { 
    FragColor = vec4(ourColor, 1.0); 
}
......
//顶点、颜色数据
float vertices[] = { 
    //位置 			    //颜色 
    0.5f, -0.5f, 0.0f,  1.0f, 0.0f, 0.0f,   //右下 
    -0.5f, -0.5f, 0.0f,  0.0f, 1.0f, 0.0f,   //左下 
    0.0f,  0.5f, 0.0f,  0.0f, 0.0f, 1.0f   //顶部 
};
......
//位置属性 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);   //步长为6个float,其中3个为位置值,三个为颜色值
glEnableVertexAttribArray(0); 
//颜色属性 
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3* sizeof(float)));   //偏移量为3个float,前三个float为位置值,后三个float才为颜色值
glEnableVertexAttribArray(1);
......

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值