写这个着色器有多难?多点阴影照明
How hard would it be to write this shader? Multipoint shadow lighting
我现在有一个简单的项目。基本上它只是一堆长方体,它们都是轴对齐的…所以它的几何结构非常简单。
无论如何,我正在考虑添加一个更好的着色器。目前我正在使用"平面着色器",这是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光栅化的一部分。
不应该花太长时间或太难掌握这个窍门,但你想要慢慢地、像婴儿一样地接近它。在为你的软件建立一个具有你想要的精确特征的照明/阴影管道时,有很多设置工作涉及到,对于最终的工作,你想要提前计划。因此,最好建立一个单独的废弃项目,并开始试验,以弄清楚事情是如何工作的。- 为什么在浮点中从大到小会引入更多的误差
- 如何模板化堆栈分配的多态指针数组到接口,包括派生类型的相应点?
- DirectX 11 - 点光源阴影
- 从数组中的文件读取多个浮点值
- 在C++中使用 PCL 在同一窗口中查看多个点云
- C++ 如何重用具有多个返回(出口点)的代码块?
- PCL :PCL可视化工具在同一视口中以不同的颜色显示多点云(XYZ)
- 如何组合同一物体的多点云手动扫描
- 粗制滥造的蒙特卡洛整合出了更多点的问题
- 多点运算符(C 类)
- 平移 - 缩放 - 使用多点触控的轨道 - 虚幻引擎 -
- iPhone中GLSL ES 2.0上多点光源的2D照明
- 未收到Windows多点触摸TOUCHEVENTF_UP
- 多点触控仅检测 2 次点击
- 安卓多点触控事件索引
- 如何使用多点写入ProcessMemory
- Qt 5.5 WebEngineView和多点触控
- Qt 5.5 -触摸/多点触摸不能在Ubuntu 14.04上工作
- 如何使Qwt接受触摸和多点触摸事件
- 写这个着色器有多难?多点阴影照明