写这个着色器有多难?多点阴影照明

How hard would it be to write this shader? Multipoint shadow lighting

本文关键字:多点 阴影 照明      更新时间:2023-10-16

我现在有一个简单的项目。基本上它只是一堆长方体,它们都是轴对齐的…所以它的几何结构非常简单。

无论如何,我正在考虑添加一个更好的着色器。目前我正在使用"平面着色器",这是GLShaderManager中的一个库存着色器。它把所有的东西都涂成扁平的颜色。然而,如果我能像下面这样构建一个着色器,我会很高兴的。

基本上我想要一个着色器,在不同的位置有不同强度的点光源阵列。可能是这样定义的

struct Light {
float x;
float y;
float z;
float intensity;
};
Light Lighting[20];

基本上基于关卡几何和灯光,我喜欢模拟基本的灯光和阴影,并且在玩家下面有一个圆圈会很酷(就像玩家实际上是他们的)。

做到这一点有多难?我该如何传递我的关卡几何和光数组呢?(注意,即使每个长方体都是自己的QUADS批处理,也可以很容易地创建任何类型的变量来存储数据)。

我使用GLTools, GLShaderManager, GLBatch, visual studio 2010,可能是任何"GSHL"。

如果你能让我知道像这样的着色器有多复杂,让我知道。如果很容易找到一个像这样的着色器,如果你能把它链接起来。

两种类型的着色器之间的区别是什么?(顶点和片段).

我想说这是相对简单的,但是关于现代GL的事情是最初的学习曲线相当陡峭。一开始,你似乎必须卷起袖子,学习如何做每件事(本质上是这样的),但后来,它开始看起来比以前更容易,因为你在司机的座位上有更多的可预测的行为。

你要学习做的第一件事之一是了解如何指定从CPU到GPU的属性。对于那些不会在每个顶点或每个片段的基础上变化的属性,比如光的位置和强度,你需要统一的属性。查看使用glUniform*函数的示例,了解如何做到这一点。这将允许您进行实验,将值从CPU端传递到GPU端,然后查看它们如何影响着色器以加速您的学习。

之后,值得学习的是如何计算直接照明,给定光线从带有phong阴影的表面反弹,分离环境,漫反射和镜面项。

之后,您甚至可能希望将这些光数据存储到环境地图中。这将使你能够使用尽可能多的光,而不影响着色器的速度。

关于顶点着色器与片段着色器,顶点着色器计算一个顶点一个顶点的基础上的东西,包括片段着色器然后使用的数据。片段着色器有点像像素着色器(在HLSL中,它实际上只是被称为"像素着色器")。它处理这些顶点之间的栅格化,并且是逐像素的操作(但是有一些潜在的透支)。通常对于照明,逻辑的真正核心将在片段着色器中,而顶点着色器作为中间步骤来计算片段着色器插值和使用的所有相关值。顶点着色器是3D几何管道的一部分,而片段着色器是2D光栅化的一部分。

不应该花太长时间或太难掌握这个窍门,但你想要慢慢地、像婴儿一样地接近它。在为你的软件建立一个具有你想要的精确特征的照明/阴影管道时,有很多设置工作涉及到,对于最终的工作,你想要提前计划。因此,最好建立一个单独的废弃项目,并开始试验,以弄清楚事情是如何工作的。