ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

OpenGL学习(2)——GLSL

2022-07-28 00:01:27  阅读:193  来源: 互联网

标签:GLSL ourColor name OpenGL someVec uniform 学习 vec4 out


glsl叫opengl shader language。是opengl专门写shader的一门语言

下面是一个典型的shader

#version version_number		// 版本号
in type in_variable_name;	// 输入
in type in_variable_name;

out type out_variable_name;	// 输出

uniform type uniform_name;	// 全局变量

int main()
{
  // 处理输入并进行一些图形操作
  ...
  // 输出处理过的结果到输出变量
  out_variable_name = weird_stuff_we_processed;
}

一个GLSL程序有如下几个部分

  • 输入:in
  • 输出:out
  • 全局变量:uniform
  • mian函数

数据类型

  • 普通:int,float,double,uint和bool
  • 容器:vector,matrix

这里以vector容器为例,glsl设置了一堆类型,有vecn,bvecn,ivecn,等等。

  1. vec前面的字符表示其保存的类型,比如bvec就是bool,ivec就是int,默认的vec就是float。
  2. 后面的n是实际数字,比如vec3,表示3个分量的vec

容器的取值和赋值会很随意。他可以一次性取多个分量。看下面的例子

vec2 someVec;
vec4 differentVec = someVec.xyxx;	//4个分量分别为someVec的x,y,x和x
vec3 anotherVec = differentVec.zyw;	// 3个分量为differentVec的z,y,w
vec4 otherVec = someVec.xxxx + anotherVec.yxzy;

// 构造也很灵活
vec2 vect = vec2(0.5, 0.7);	// 
vec4 result = vec4(vect, 0.0, 0.0);
vec4 otherResult = vec4(result.xyz, 1.0);

Uniform

uniform变量,是一种全局变量,在一个着色器中声明后,可以通过opengl代码修改这个变量的值

比如,我们定义一个ourColor这个uniform

#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;	

// 获取uniform的location
int vertexColorLocation = glGetUniformLocation(shaderProgram, "ourColor");
glUseProgram(shaderProgram);
// 设置值,有很多个函数,都是以glUniform...开头的,这里是4f,提供4个浮点数表示颜色
glUniform4f(vertexColorLocation, 0.0f, greenValue, 0.0f, 1.0f);

标签:GLSL,ourColor,name,OpenGL,someVec,uniform,学习,vec4,out
来源: https://www.cnblogs.com/destinyzk/p/16527017.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有