白话GPU基本概念之Shader
白话GPU基本概念之Shader
导读:在计算机图形学和游戏开发领域,GPU(图形处理器)扮演着至关重要的角色。而Shader作为GPU中负责图形渲染的核心组件,其重要性不言而喻。本文将从Shader的基本概念出发,深入浅出地介绍其在图形渲染中的作用、分类以及主流的编程语言,帮助读者全面了解这一关键技术。
引言
Shader中文名叫着色器,顾名思义,它的作用可以先简单理解为给屏幕上的物体画上颜色。而什么东西负责给屏幕画颜色?当然是GPU,所以我们写shader的目的就是告诉GPU往屏幕哪里画、怎么画模型有了之后,给这个模型各种各样的效果,其实就是着色(上色)的过程,所以Shader叫着色器也是合适的。
定义
Shader是专门用来渲染图形的一种技术,通过shader,我们可以自定义显卡渲染画面的算法,使画面达到我们想要的效果。小到每一个像素点,大到整个屏幕,比如下面原神游戏中的渲染效果。
Shader分类
Shader分为两类:
- 顶点Shader(3D图形都是由一个个三角面片组成的,顶点Shader就是计算每个三角面片上的顶点,并为最终像素渲染做准备)。
- 像素Shader,顾名思义,就是以像素为单位,计算光照、颜色的一系列算法。
几个不同的图形API都有各自的Shader语言,在DirectX中,顶点shader叫做 Vertex Shader ,像素Shader叫做 Pixel Shader; 在OpenGL中,顶点Shader也叫做 Vertex Shader ,但像素Shader叫做 Fragment Shader,也就是我们常说的片断Shader或者片元Shader。
Vertex Shader负责获取处理的网格(Mesh)资讯然后进行处理,比方说我们想渲染一个正方形,那么首先就得先获取这个正方形的位置,纹理等信息,然后做一些矩阵转换传递给Fragment Shader.
网格中的像素经过处理之后被存储在Fragments中被传给Fragment Shader。当Vertex Shader处理顶点的时候,它会将平均每三个顶点组成一个Fragment,最终整个被处理过的图像被称作Fragments。
再说白点,Shader其实就是一段Code,这段Code的作用是告诉GPU具体怎样去绘制模型的每一个顶点的颜色以及最终每一个像素点的颜色
Shader编程语言
Shader目前主流的有三种语言:
1)基于OpenGL的OpenGL Shading Language,简称GLSL。
2)基于DirectX的High Level Shading Language,简称HLSL。
3)还有NVIDIA公司的C for Graphic,简称Cg语言。
GLSL与HLSL分别是基于OpenGL和Direct3D的接口,两者不能混用。而Cg语言是用于图形的C语言,这其实说明了当时设计人员的一个初衷,就是让基于图形硬件的编程变得和C语言编程一样方便,自由。正如C++和 Java的语法是基于C的,Cg语言本身也是基于C语言的。如果您使用过C、C++、Java其中任意一个,那么Cg的语法也是比较容易掌握的。Cg语言极力保留了C语言的大部分语义,力图让开发人员从硬件细节中解脱出来,Cg同时拥有高级语言的好处,如代码的易重用性,可读性高等。
Cg语言是Microsoft和NVIDIA相互协作在标准硬件光照语言的语法和语义上达成了一致,所以,HLSL和Cg其实是同一种语言。