首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

金属:如何在不进行颜色/灰度转换的情况下将图像附加到着色器?

在不进行颜色或灰度转换的情况下将图像附加到着色器,通常涉及到图形渲染管线中的纹理映射过程。以下是一些基础概念和相关步骤:

基础概念

  1. 纹理(Texture):纹理是一种用于贴图的技术,它可以将图像数据映射到3D模型的表面。
  2. 着色器(Shader):着色器是一种特殊的程序,用于在GPU上执行,以渲染3D图形。它们控制着物体表面的外观。
  3. UV坐标:UV坐标是二维坐标系统,用于将二维纹理映射到三维模型的表面上。

相关优势

  • 真实感:使用纹理可以大大增加模型的视觉真实感。
  • 效率:纹理映射比复杂的几何建模更高效。
  • 灵活性:可以轻松更换或修改纹理,而不需要改变模型的几何形状。

类型

  • 2D纹理:最常见的纹理类型,用于平面或简单的曲面。
  • 3D纹理:用于体积数据,如云层模拟或医学成像。
  • 立方体贴图:用于环境映射,模拟反射和折射效果。

应用场景

  • 游戏开发:角色、环境和物体的表面细节。
  • 虚拟现实:增强沉浸感,提供详细的视觉体验。
  • 电影制作:特效和动画中的背景和细节补充。

实现步骤

  1. 加载图像:首先需要将图像加载到内存中,并创建一个纹理对象。
  2. 设置纹理参数:配置纹理的过滤和包裹模式。
  3. 编写着色器程序:在顶点着色器和片段着色器中处理UV坐标和纹理采样。
  4. 传递纹理到着色器:使用uniform变量将纹理传递给着色器。
  5. 渲染:在渲染循环中,使用着色器程序绘制模型,并应用纹理。

示例代码(OpenGL)

代码语言:txt
复制
// 加载纹理
GLuint textureID;
glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);
// 设置纹理参数
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// 加载图像数据到纹理
int width, height, nrChannels;
unsigned char *data = stbi_load("path_to_image.jpg", &width, &height, &nrChannels, 0);
if (data)
{
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
    glGenerateMipmap(GL_TEXTURE_2D);
}
else
{
    std::cout << "Failed to load texture" << std::endl;
}
stbi_image_free(data);

// 在着色器中使用纹理
// 顶点着色器
const char *vertexShaderSource = "#version 330 core\n"
    "layout (location = 0) in vec3 aPos;\n"
    "layout (location = 1) in vec2 aTexCoord;\n"
    "out vec2 TexCoord;\n"
    "void main()\n"
    "{\n"
    "   gl_Position = vec4(aPos, 1.0);\n"
    "   TexCoord = aTexCoord;\n"
    "}\0";
// 片段着色器
const char *fragmentShaderSource = "#version 330 core\n"
    "out vec4 FragColor;\n"
    "in vec2 TexCoord;\n"
    "uniform sampler2D ourTexture;\n"
    "void main()\n"
    "{\n"
    "   FragColor = texture(ourTexture, TexCoord);\n"
    "}\n\0";

// 编译和链接着色器程序,然后在渲染循环中使用它

可能遇到的问题及解决方法

  • 纹理不显示:检查纹理是否正确加载,UV坐标是否正确设置,以及着色器中纹理单元是否正确绑定。
  • 颜色失真:确保图像数据的格式与着色器中采样的格式匹配。
  • 性能问题:优化纹理大小和格式,使用mipmap减少远处物体的锯齿。

通过以上步骤和代码示例,可以在不进行颜色或灰度转换的情况下,将图像成功附加到着色器中。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

基础渲染系列(十)——更复杂的复合材质

1.1 遮挡贴图 要添加自阴影,我们可以使用所谓的遮挡贴图。你可以将其视为材质的一部分,固定阴影贴图。用于凹陷电路的这种贴图,一般为灰度图像。 ?...就像金属贴图一样,使着色器功能仅在设置遮挡贴图时才对其进行采样。仅将功能添加到基本通道中,因此不必担心会出现其他灯光影响。 ?...因此,请复制该方法并进行所需的更改。尽管DoMetallic在没有贴图的情况下会显示滑块,但我们需要在此做相反的操作。另外,Unity的标准着色器使用遮挡贴图的G颜色通道,因此我们也将这样做。...(细节遮罩) Unity的标准着色器使用细节蒙版的Alpha通道,因此我们也使用该通道。上图将所有四个颜色通道设置为相同的值。 将此贴图的属性添加到我们的着色器。 ?...但我不希望这样做,因为颜色的选择不像使用或不使用纹理那样是二进制的。容易出现意料之外的问题,例如未应用的动画颜色,因为它们最初是白色的。 标准着色器确实根据自发光的颜色设置其自发光关键字。

2.4K30

基础渲染系列(三)多样化的表现——组合纹理

灰度细节纹理将通过变暗和变亮来严格调整原始颜色。这是相对直接的方式。与非灰色的颜色相乘会产生较不直观的结果。彩色细节纹理用于产生细微的颜色偏移。...它使用的公式比简单的幂运算更复杂,但是它存储的平均伽玛值为1 / 2.2的颜色。在许多情况下,这是一个合理的近似值。要将数据转换回原始颜色,请应用2.2的伽玛校正。 ? ?...这就是我们到目前为止所假设的。 但在线性空间中渲染时,这不再成立。GPU将纹理样本转换为线性空间。同样,Unity还将材质颜色属性转换为线性空间。然后,着色器将使用这些线性颜色进行操作。...这就是变暗的原因。 可以通过在细节纹理的导入设置中启用“Bypass sRGB Sampling”来解决此错误。这样可以防止从伽马转换为线性空间,因此着色器将始终访问原始图像数据。...将属性添加到着色器属性,就像在C#代码中一样。NoScaleOffset属性将按照其名称所示进行操作。它却将平铺和偏移称为比例和偏移。这个命名是不一致的。

2.7K10
  • 基础渲染系列(九)——复合材质

    (统一值,非金属VS金属) 2.1 金属贴图 标准着色器支持金属贴图。这些贴图定义了每个纹理像素的金属值,而不是一次定义整个材质。这是一张灰度图,将电路标记为金属,其余标记为非金属。...将所需的采样器和float变量添加到包含文件中。 ? 创建一个GetEmission函数以检索发出的颜色(如果有)。有贴图时,对其进行采样并乘以均匀的颜色。否则,只需返回均匀的颜色即可。...在所有其他情况下,emission 为零,编译器将对其进行优化。 ? 由于发射光来自物体本身,因此它与反射光无关。只需将其添加到最终颜色即可。 ?...要有意义的使用HDR颜色,必须执行色调映射。这意味着你将一种颜色范围转换为另一种颜色范围。我们将在以后的教程中研究色调映射。HDR颜色通常也用于创建光晕效果。...如果在颜色为黑色的情况下指定了纹理,则标准着色器会自动将自发光颜色设置为白色。你也可以添加此功能。但是,该行为可能会导致某些情况下被强制修改,产生BUG。 ? ?

    3.5K10

    ISUX译文 | The PBR Guide基于物理的渲染指引(下)

    金属贴图中并没有包含直接被材质引用的真实世界的数据(如反照率颜色、反射值等),它只是比较简单地对着色器描述Base Color中的哪个区域应该被解析成反照率颜色(非导体),哪个区域应该被描述成金属的反射值...这种情况下就要求设计师有更好的PBR理论知识,例如了解非导体(电介质)的正确F0值,金属在漫反射色下表现为纯黑,以及在着色器没有自动校正情况下,能量守恒相关的基础知识。...而S/G相关的贴图只能用于实时着色器。 对于不同的渲染器,你可能可以直接使用BaseColor/Metallic/Roughness贴图,又或者需要对它们进行转换。...Substance协作插件可以将Substance材质的输出物直接转换到特定渲染器可使用的格式。...举个例子,3ds Max的Substance协作插件有各类预设,可以与Arnold、Vray、Corona打通。使用这些预设会自动将Substance输出贴图进行转换,并可直接应用在这些渲染器中。

    1.4K20

    Unity通用渲染管线(URP)系列(十三)——颜色分级(Playing with Colors)

    首先是色彩校正,其目的是使图像与观察场景时的图像相匹配,以补偿介质的局限性。其次是颜色分级,即获得与原始场景不匹配且不需要逼真的预期外观。这两个步骤通常合并为一个颜色分级步骤。...(没有颜色调整的图像,neutral色调映射) 1.1 颜色分级在色调映射之前 在色调映射之前进行颜色分级。在色调映射Pass之前,将其函数添加到PostFXStackPasses。...通过RgbToHsv将颜色格式从RGB转换为HSV,将色相偏移添加到H,然后通过HsvToRgb转换回来,可以调整颜色的色调。由于色相是在0~1的色轮上定义的,因此如果色相超出范围,我们必须将其截断。...(温度 -100 和100) Tint可用于补偿不希望的色彩平衡,将图像推向绿色或品红色。 ? ? (Tint 为-100和100) 2.2 分离色调 分离色调工具用于分别为图像的阴影和高光着色。...然后将参数也添加到ColorGrade,这次默认设置为false。将其传递给需要它的功能。适当时,应通过ACEScg_to_ACES将最终颜色转换为ACES颜色空间。 ?

    4.3K31

    Unity通用渲染管线(URP)系列(七)——LOD和反射(Adding Details)

    1.3 LOD转换 LOD级别的突然转换可能会在视觉上造成冲击,尤其是如果某个对象由于自身或摄像机的轻微移动而最终连续快速地来回切换时。通过将组的淡入淡出模式设置为交叉淡入淡出,可以逐步进行此过渡。...Unity为LOD_FADE_CROSSFADE关键字选择一个着色器变体,因此将其的多编译指令添加到我们的Lit着色器中。对CustomLit和ShadowCaster传递都执行此操作。 ?...为了使这一点更加明显,我在Baked Light 场景中添加了新的金属球,这些金属球具有不同的颜色和平滑度。 ?...(环境探针) 2.3 粗略的反射 当粗糙度使镜面反射发生散射时,它不仅降低了强度,而且使图像变得模糊,就好像没有聚焦。通过将环境图的模糊版本存储在较低的Mip级别中,Unity可以近似此效果。...在理想情况下,它用纯白色代替镜面反射的BRDF颜色,但粗糙度可以防止出现反射。我们通过将表面平滑度和反射率加在一起,得出最终颜色,最大值为1。由于是灰度,因此可以在BRDF上添加单个值就足够了。

    4.5K31

    Unity通用渲染管线(URP)系列(八)——复杂的贴图(Masks, Details, and Normals)

    不这样做会导致GPU在对纹理进行采样时错误地应用伽马到线性转换。 ? (MODS遮罩贴图) 将遮罩贴图的属性添加到“Lit”。因为这是一个遮罩,我们使用白色作为默认颜色,就不会改变任何颜色。...与其创建具有更好遮挡数据的另一个遮罩贴图,不如将遮挡强度滑块属性添加到我们的着色器中。 ? ? (遮挡滑块,降低至0.5) 将其添加到UnityPerMaterial缓冲区。 ?...将所需的纹理,采样器状态和缩放偏移属性添加到LitInput,以及TransformDetailUV函数以转换细节纹理坐标。 ?...3.2 细节反照率 要向反照率添加细节,我们需要为GetBase添加细节UV参数,默认情况下将其设置为零,以使现有代码不会中断。首先,将所有细节直接添加到基础贴图,然后再考虑颜色。 ?...然后,可以使用切线空间法线和转换矩阵作为参数来调用TransformTangentToWorld。将执行所有这些操作的功能添加到Common。 ?

    4.4K40

    Unity通用渲染管线(URP)系列(三)——方向光(Direct Illumination)

    默认情况下,通用管道也使用灰色。 ? 我们将使用一种自定义的光照方法,通过将着色器的照明模式设置为CustomLit来进行说明。...它可以在任何适当的3D空间中执行光照计算。因此,我们保留了定义的空间不填。填充数据时,我们仅需在各处使用相同的空间即可。现在使用的是世界空间,但是稍后我们可以切换到另一个空间,并且一切任然正常进行。...将索引和VisibleLight参数添加到SetupDirectionalLight。用提供的索引设置颜色和方向元素。...它是矩阵的第三列,必须再次取反。 ? 最终颜色已经应用了光源的强度,但是默认情况下Unity不会将其转换为线性空间。...没有它,非金属将不会获得镜面反射高光。 ? 3.6 镜面颜色 以一种方式反射的光,不能全部以另一种方式反射。这称为能量转换,意味着出射光的量不能超过入射光的量。

    5.8K40

    Android OpenGL开发实践 - GLSurfaceView对摄像头数据的再处理

    片段着色器对目标点进行颜色赋值。...(所有点相互相连,首尾相连) GL_TRIANGLES 填充三角形(将每三个点围成的三角形进行填充,相邻的点之间不填充) GL_TRIANGLE_STRIP 填充三角形(将每三个点围成的三角形进行填充,...下面我们来看一个新的片段着色器,它用一个简单的公式对当前像素点的rgb值进行加权,然后将rgb值都设置为此加权值形成灰度图的效果: ?...对图像数据的处理,为了达到实时性的要求,一般情况下还是需要用OpenGL在GPU上完成。所以在拿到相机YUV数据以后,我们需要把YUV数据转换成GPU可用的普通RGBA纹理才方便对数据进行再处理。...将YUV数据转换成类似RGBA的每个像素点包含YUVA格式的字节流,然后用YUV到RGB的转换矩阵在着色器程序中实现。

    13.1K124

    基础渲染系列(八)——反射

    (有时候它们会反射自己) 1 环境贴图 当前,我们的着色器通过组合表面上的环境反射,漫反射和镜面反射为片段着色。至少在表面比较粗糙的情况下,会产生看似逼真的图像。...(一个闪亮的白色金属球) 但结果表面几乎是全黑的,即使它自己的颜色设置是白色。我们只看到一个小的亮点,把光源直接反射给了我们。所有其他光都沿不同方向反射回去。如果将平滑度增加到1,则高光也会消失。...将场景的环境强度设置为零,以便我们专注于反射。再次将我们的材质变成无光泽的非金属,平滑度为0.5。然后将间接镜面反射颜色更改为明显的颜色,例如红色。 ? ? ?...这是因为立方体贴图包含HDR(高动态范围)颜色,这使其可以包含大于1的亮度值。我们必须将样本从HDR格式转换为RGB。 UnityCG包含我们可以使用的DecodeHDR函数。...(没有嵌套反射) 我们的镜子不包含在反射本身中,因为它们不是静态的。因此,让我们将地板镜子设为静态。球体应该保持动态,因为否则探针将无法再看穿它们,从而产生怪异的反射。 ?

    4.1K30

    基础渲染系列(四)——光照(Unity)

    那是因为它们也得到了同比的缩放。因此,我们必须在转换后对再其进行归一化。 ? ? (归一化后的法线) 虽然我们再次对向量进行了归一化,但是对于没有统一比例尺的对象,它们看起来很奇怪。...当使用恒定的镜面反射色时,我们可以简单地通过将反射率乘以1减去镜面反射来调整反照率色度。但是手动进行操作不方便,特别是如果我们要使用特定的反照率色度时。因此,让我们在着色器中执行此操作。 ? ?...白色的镜面反射色可形成完美的镜面,因此完全消除了反照率。 ? (节能) 4.1 单色 当镜面反射色是灰度颜色时,此方法效果很好。但是当使用其他颜色时,会产生奇怪的结果。...这称为金属工作流程。试试看。 哪个工作流程更好? 两种方法都很好。这就是为什么Unity每种都有一个标准着色器的原因。金属化的工作流程更为简单,因为你只有一个颜色来源和一个滑块。这足以创建逼真的材质。...之所以如此,是因为在其他情况下也使用了灯光结构。 实际上,GGX BRDF版本甚至不使用ndotl。它会自己计算,因为它会与正常情况进行比较。与往常一样,着色器编译器将摆脱所有未使用的代码。

    2.7K20

    ISUX译文 | The PBR Guide 基于物理的渲染指引(上)

    因此,物质的厚度在光的散射和吸收中是一个重要的因素。厚度贴图可以用作描述物体的厚度,并且能被用于着色器进行渲染。...朗伯体(Lambertian Model,一种在着色渲染中用来展示标准漫反射的材质)就没有将表面粗糙计算在内。而其他漫反射光照模型,如Oren-Nayer Model,就有算上表面粗糙。...本文将会对金属与非金属的特性进行拆解,并分别讲述它们的制作规范。 在作为导体的金属材质中,由于折射光被吸收,所以金属的颜色来自于反射光线。...同样,在Substance Integration插件中使用Substance材质时,输出结果已经根据贴图的色彩空间(线性或sRGB)、以及所在程序的色彩管理设置进行自动转换。...光的计算都在线性空间中执行:所有含色彩信息的贴图(如Base Color)通常都会被着色器转换成Linear用于计算。

    1.7K20

    unity3d:Shader知识点,矩阵,函数,坐标转换,Tags,半透明,阴影,深度,亮度,优化

    以下是一个示例,展示了如何在片段着色器中使用 Unity_WorldToObject 进行位置转换: float4 fragShader(float4 vertex : SV_POSITION) : SV_Target...顶点着色器负责将顶点从模型空间转换到屏幕空间,并进行一些基本的顶点变换和处理。因此,顶点着色器的执行次数与模型的顶点数成正比。...有些情况下,例如在使用简化的渲染技术(如LOD)或剔除不可见物体时,可以减少片段着色器的执行次数来提高性能。优化渲染流程可以根据具体情况对顶点和片段着色器的执行进行优化。...使用亮度可以实现各种效果,例如: 灰度化:通过将颜色的 R、G、B 通道都设置为相同的亮度值,可以将图像转换为灰度图像。...这意味着渲染的图像不包含半透明像素,所有像素都是完全不透明的,Alpha 通道值为 1。这对于一些特定的渲染效果或优化渲染性能时非常有用,因为不需要处理透明度相关的计算和混合操作。

    47710

    基础渲染系列(十四)——雾

    这将为FOG_LINEAR,FOG_EXP和FOG_EXP2关键字带来额外的着色器变体。仅将此指令添加到两个前向pass中。 ? 接下来,向“My Lighting”添加一个函数以将雾应用于片段颜色。...2.1 图像效果(影像效果) 要将雾添加到延迟渲染中,我们必须等到所有灯光都渲染完毕后,再进行一次pass以将雾因素叠加。由于雾应用于整个场景,所以,可以像渲染定向光一样。...该方法将绘制一个带有着色器的全屏四边形,该着色器仅读取源纹理并输出未经修改的采样颜色。 ? 场景再次像往常一样被渲染。但是,如果你检查帧调试器,则会看到为我们的图像效果添加了一个pass。 ?...(绘制 image effect) 2.2 雾着色器 简单地复制图像数据是没有用的。我们必须创建一个新的自定义着色器,以将雾化效果应用于图像。从一个简单的着色器开始。...如果不想对天空盒进行雾化,可以通过将雾化因子设置为1来防止这种情况。 ? ? (天空盒没有雾化) 如果确实要对整个图像应用雾化效果,则可以通过宏定义对其进行控制。

    3K20

    基础渲染系列(二)——着色器

    (默认的球体) 变换(transform )组件用于更改网格和包围盒的位置,方向和大小。实际上,如第1部分“矩阵”中所述,使用了整个转换层次结构。如果对象最终出现在相机的视图中,则安排进行渲染。...四个,因为我们正在使用4 x 4转换矩阵,如第1部分,矩阵中所述。 将函数的类型从void更改为float4。float4只是四个浮点数的集合。现在返回0。 ? 0这个返回值有效值吗?...但如果我们编写的是支持透明度的着色器,这个结果就会是透明的。我们将在以后的教程中进行介绍。 片段程序也需要语义。在这种情况下,我们必须指出最终颜色应写入的位置。...因此,让我们改为使用网格中的局部位置作为颜色。但如何将多余的数据从顶点程序传递到片段程序呢? GPU通过栅格化三角形来创建图像。它需要三个已处理的顶点并在它们之间进行插值。...(UV作为颜色,正面和上方) 4.2 添加纹理 要添加纹理,你需要导入图像文件。下面我将用于测试目的的一个纹理。 ? (测试纹理) 你可以通过将图像拖到项目视图中来将其添加到项目中。

    4K20

    基础渲染系列(十六)——静态光照

    这些函数仅在定义了适当的关键字后才起作用,因此请将其着色器功能添加到pass中。 ? 3.4 顶点程序 顶点程序对于此过程很简单。转换位置并转换纹理坐标。 ?...我们正在将颜色与光照贴图中展开的对象的纹理相关联。要执行此映射,必须使用光照贴图坐标而不是顶点位置,并进行适当的转换。 ?...该函数将决定输出哪个以及如何对其进行编码。 UnityMetaInput也包含镜面反射颜色,即使它不存储在光照贴图中。它用于一些编辑器的可视化效果,这时我们将忽略它们。 ?...3.6 粗糙的金属 现在,我们的着色器似乎可以正常工作,但是与标准着色器的结果不完全匹配。当使用平滑度非常低的有色金属时,这一点很明显。 ? ?...(粗糙的绿色金属 标准 VS 我们的着色器) 这个想法是,非常粗糙的金属应该产生比我们目前的计算结果更多的间接光。标准着色器通过将部分镜面反射颜色添加到反照率来对此进行补偿。

    3.8K20

    three.js 着色器材质之纹理

    今天郭先生说一说如何在three.js着色器中添加纹理,先看看今天要完成的效果,在线案例请点击着色器纹理。...使用表面纹理还是地球的外貌,海拔灰度图给地球添加凹凸效果,云朵纹理给地球添加云朵效果。下面我们说一说代码。 1. 绘制几何体,加载贴图 我们只需要在一个球体中进行操作,所以新建一个球体。...使用uniform变量 这里除了将三张纹理传到着色器中,还传递了一个时间,这个时间来让纹理动起来。...顶点着色器 顶点着色器我们只是用地球的灰度图,这里面是用texture2D( texture2, vUv )来获取图片中每个点的颜色值。...片元着色器 片元着色器使用两个纹理,还是顶点着色器传过来的uv以及时间。这里tcolor1就是地图点的颜色,tcolor3代表云朵的纹理,但是他的uv是随时间变化的(这里要求纹理设置重复)。

    3.6K10

    ThreeJS 不可忽略的事情 - Gamma色彩空间

    2. sRGB颜色空间: sRGB是当今一般电子设备及互联网图像上的标准颜色空间。较适应人眼的感光。...3. gamma转换:线性与非线性颜色空间的转换可通过gamma空间进行转换。 WX20191125-143730@2x.png 在着色器中色值的提取与色彩的计算操作一般都是在线性空间。...具体的转换threejs会在着色器中进行,我们只需要关注为贴图指定好色彩空间,或者直接调用转换函数。 具体步骤如下: 1. sRGB转Linear A....空间,展示到屏幕时需要通过gamma校正,将linear转换回sRGB空间,也就是进行gamma校正,threejs中可通过设置gammaOutput和gammaFactor,进行gamma校正,校正后的...使用不受光照影响的材质,例如 MeshBasicMaterial,着色器不需要做复杂的计算,故不需要进行色彩空间转换。

    10.3K204

    图形编辑器基于Paper.js教程17:图像转gcode前的处理,灰度,黑白,抖动

    今天就来说一下如何将一张图片转换成gcode,使用激光雕刻机雕刻出来。 对于一张图片的每个像素,只有两种结果一种雕刻,一种事不雕刻。在GCode上表现为G0(不雕刻);G1(雕刻)。...彩色转灰色 有一个公式 Gray=0.299⋅R+0.587⋅G+0.114⋅B js的函数实现 /** * 将图像的每个像素转换为灰度 * @param {HTMLImageElement} image...上面这个是原图,我最近在做的旋转配件测试。 把这图片进行灰度化后就变成了下面的效果 上面的就是灰色图,这让我想起了小时候家里的黑白电视。...那么接下来就要思考 如何在只有黑白两种颜色的情况下尽可能多地展示图片的细节? 我在这里也卡了很久,通过查阅资料 得知了抖动这一图片算法。...灰度值的误差是这样计算的, 比如当前像素的灰度值是200,那么它应该转换为255,误差是55,将这个误差55,加到相邻的上下左右的像素上。

    9610

    进阶渲染系列(七)——三向贴图(任意表面纹理化)【进阶篇完结】

    在确定片段的颜色时,现在依靠表面而不是再次调用getter函数。 ? 并且在填充G缓冲区以进行延迟渲染时。 ?...默认情况下,是UV坐标,主要和详细UV都打包在单个float4中。替代输入可以是位置和法线向量。将SurfaceParameters结构添加到包含所有这些输入的Surface文件中。 ?...这与Z投影的XYZ方向匹配,但与其他两个不匹配。 在Y投影的情况下,向上方向对应于Y,而不是Z。因此,我们必须交换Y和Z才能从切线空间转换为世界空间。同样,我们必须将X和Z交换为X投影。 ? ?...因此,将表面法线转换为投影空间,在此切线空间中进行混合,然后将结果转换为世界空间。 ? ?...将其支持添加到除阴影通道之外的所有通道中。 ? 将这些额外的映射添加到我们的着色器GUI。使用顶部反照率贴图需要确定是否设置了关键字。 ?

    2.5K30
    领券