shader glsl 还在乱说(二)

本文介绍了GLSL中的Uniform,它是CPU传递给GPU的统一值,用于着色器中的计算和渲染。通过代码示例解释了如何声明和使用Uniform,以及它的作用。此外,文章还提到了gl_FragCoord作为变化值在fragmentshader中的应用,它表示当前处理的像素坐标,不是统一值而是varying值。
摘要由CSDN通过智能技术生成

shader glsl 还在乱说(二)

在上一篇文章简单介绍了一下glsl版本的hello world。

相信大家会说就这?不是有手就行?浪费我两分钟的时间,这作者真该死(手动狗头),我知道你很急但是你别急。

Unifroms

咱们这张难度就不一样了,我们这篇水文,讲解一个东西叫unifrom,咱们老规矩还是翻译一下 unform => 统一,那这不手拿把掐了吗,不就是统一值吗。

什么是统一值

那么问题来了,什么叫统一值呢?那这不是见名知意,那不就是在着色器定义一个这么一个大家都一样的值,然后大家每个片段都一样。

那么问题又来了,unifrom是谁传给谁的是给谁用的,是怎么用的?有什么特点呢?

首先我们先来说第前两个问题

unifrom 是 cpu传递给gpu的发送数据

那么是怎么用的呢

  • 首先在着色器声明一个unifrom变量,指定类型和名称。就是你想和女朋友出门约会你是不是得先有一个女朋友(别管有没有气)

  • 第二步呢在cpu端获取该unifrom的位置,然后使用glGetUnifromLocation的函数。就是你现在有女朋友了是不是得主动点问人家地址,然后你一打电话,喂~,小丽啊,你家在哪,然后小丽害羞的和你说了地址。

  • 然后你是不是得给这个变量赋值。就是你知道人家的地址了,然后你篮球也不带,舞蹈鞋也不带,唱筒也不带,然后人家以为你不是ikun,不和你好了怎么办???

  • 最后你得让着色器使用unifrom计算或者渲染,就是人家一看你铁ikun,然后就和你出去约会去了。

    你回头一看这使用unifrom就这几步啊???这比我给女朋友打气然后在放气还简单、

实战一下

行了咱们也纸上谈兵,谈了一分钟了是时候真枪实战三分钟了

#ifdef GL_ES
prcision mediump float;
#endif

unifrom float i_time;
void main(){
    gl_FragColor = vec4(abs(sin(u_time)),0.0,0.0,1.0);
}

哎咱们还是第一节课的代码,气不气你以为我会写很多???

nonono,我只是给你科普,给我水文一下glsl,这里我只写一行代码

gl_FragColor = vec4(abs(sin(u_time)),0.0,0.0,1.0);

这行代码就已经进行到了第五步,出去约会了。

什么你问这行代码什么意思???

那不就是gl_FragColor 也就是自带的表示着色器的存储地址(小丽住址),然后你给他赋值四维向量先sin一下在abs一下嘛(小丽)。哦原来你不知道abs 和 sin啊,那chatgpt百度查一下啊,查一下什么是绝对值和正弦函数。(手动狗头)

行了那今天就说到这了。

别急

你以为我讲完了,最开始我也这么想的,后来我看到了下面还有一节。

gl_FragCoord

我们还行先翻译一下这个是什么意思, 这不就是坐标嘛,那不就是存储了活动线程正在处理的像素或者屏幕碎片嘛。那就有问题了,什么叫活动线程,顾名思义,那不就是正在执行任务的线程,在这里不就是渲染线程吗。

什么你不知道什么叫像素点和屏幕碎片?简单理解一下你是不是知道所谓的1920*1080,实际上这个1920就代表了横向多少个像素,1080纵向有多少个像素。一般包括了两部分一个是颜色信息一部分是位置信息当然还有很多比如深度值、法线向量、纹理坐标等等。

那问题来了,你觉得这个值是统一值吗,有的童鞋没看全就是简单看一下标题,肯定说废话,标题不就是uniform统一值吗,结果呢?还真不是这个值是varying变化值。什么叫变化值呢?简单来说就是这个值就是随着渲染过程的处理而同时进行改变的值。什么你和我说着是插值?你说的很对,但是我不说。

什么你要看代码?

行我给你去扒个代码

#ifdef GL_ES
precision mediump float;
#endif

uniform vec2 u_resolution;
uniform vec2 u_mouse;
uniform float u_time;

void main() {
	vec2 st = gl_FragCoord.xy/u_resolution;
	gl_FragColor = vec4(st.x,st.y,0.0,1.0);
}

这串代码简单就是设置一个判断的宏,然后设置中等精度,然后自定义三个变量,分别是像素,鼠标坐标、时间变量,然后进入主函数,然后将当前活动坐标归一化。最后把归一化的值赋值,最后我们给整个像素当前的颜色。

就是总而言之,言而总之就是frag就是操作像素的一个着色器,如果这个值你觉得是每个像素都用的就用unifrom统一值,你觉得每个像素不一样你就用varying变化值。

说到这也简单说一下我感觉常见的unifrom值:光照防线、材质、纹理;在说一下varying变化值:纹理坐标、法线坐标。

如果你看完了,觉得我写的很棒,那么问题来了你千万别催我写下一节,因为我很懒惰,但是也别失望,因为我说不定什么时候会勤奋。

但是如果你对这方面的知识很饥渴,https://thebookofshaders.com 我感觉这个网站是你的不二选择。

封面图片 ANTIPOLYGON YOUTUBE 来自于 Unsplash

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值