在 PGF/TikZ 手册中名为“通用(功能)着色”的部分中,有创建通用功能着色的命令的“解释”。
本节的作者假设 TeX 用户知道如何使用类型 4 函数。
但我不知道,那么我在哪里可以学到?有人能解释一下如何使用这个命令创建阴影吗?
答案1
TikZ 手册中提到的第 4 类函数是所谓的 Postscript 计算器函数,它是 PDF 规范支持的 Postscript 子集。实际子集在第 7 章中描述PDF 1.7 参考手册. 第四类函数本身在Postscript 语言参考第三版。
除非您精通 Postscript 语言,否则我认为 PGF 的这一方面不太容易理解。
答案2
我不知道从哪里可以学到所有材料,但我可以尝试给你一些建议。以下内容附带说明,我只是涉猎了一点着色器编写,当然不是这个主题的专家。
从抽象的角度来说,函数式着色器由一个函数给出F:R → [0,1]³,其中 R 是 ℝ² 的某个子集(通常是矩形),[0,1]³ 被解释为所有 RGB 颜色的空间。所以F为阴影区域的每个点分配一种颜色。你的任务是提供F。 然后,每一次图像被渲染,观众评价F在图像内部的每个像素上(R 对应的点),并用返回的颜色为像素着色。
在 PGF 中,您可以使用以下命令指定此类函数\pgfdeclareshading
:
\pgfdeclarefunctionalshading
{⟨shading name⟩}
{⟨lower left corner⟩}{⟨upper right corner⟩}
{⟨initialization code⟩}
{⟨code for the actual shading⟩}
这里{⟨lower left corner⟩}{⟨upper right corner⟩}
指定了矩形域 R ⊆ ℝ²,⟨initialization code⟩
暂时可以忽略(详情请参阅 PGF 手册),这⟨code for the actual shading⟩
是最难的部分。
阴影的实际代码必须用非常有限的子集来编写后记。大概是因为它的限制太严格,迫使你只能写非常简单的函数。即便如此,请注意,渲染一个阴影可能需要很长时间(并且每次显示文档时都必须进行渲染)。
PostScript 是基于堆栈的编程语言。如果您不熟悉这个概念,请尝试阅读有关该主题的维基百科文章。如果您不习惯基于堆栈的语言,请注意,即使编写非常简单的函数也可能是一个挑战。
允许的子集在 PGF 手册或 PDF 参考中列出:基本上,您只能使用数学函数、堆栈操作运算符和 if-then-else。您会注意到没有循环和变量。操作本身在 3.6 节中描述Postscript 语言参考第三版或者大概是其他关于 PostScript 的好书(例如参见维基百科的参考资料)。
在开始执行着色器函数时,堆栈由 R 中某个点的 x 和 y 坐标组成(以大点为单位),执行后,堆栈顶部的三个元素应为 [0,1] 中的实数,这些实数被视为该点颜色的红、绿、蓝分量。
答案3
作为创建复杂阴影的不同方法:您可以使用从上方查看的三维 pgfplots 图,并使用该colormap
功能获取颜色。
例如,您在评论中提到的阴影,(1/r)*(cos(theta))^2
在极坐标系中,可以像这样实现:
\documentclass{article}
\usepackage[]{pgfplots}
\begin{document}
\begin{tikzpicture}
\pgfplotsset{colormap={redblue}{rgb(0cm)=(1,0,0); rgb(1cm)=(0,0,1)}}
\begin{axis}[
view={0}{90},
width=7cm, height=7cm,
xmin=-0.707, xmax=0.707, ymin=-0.707, ymax=0.707,
hide axis]
\addplot3 [
domain=0:360,
y domain=0.1:1,
surf,
shader=interp
] ({y*cos(x)},
{y*sin(x)},
{(1/y)*(cos(x))^2});
\end{axis}
\end{tikzpicture}
\end{document}
r=0
请注意,由于项 ,在 处有一个奇点1/r
,这就是为什么中间有一个洞。洞越小,阴影就越不有趣。