如何在三角形曲面细分评估着色器中插值 UV 映射坐标?
How do you interpolate UV mapping coords in a triangle tessellation evaluation shader?
我试图在我的TES中以这种方式插值UV坐标,但没有成功。进行UV坐标插值的正确方法是什么? 我说我正在使用三角形镶嵌。
#version 450 core
layout (triangles, equal_spacing, cw) in;
in vec2 UV_tcs[];
out vec2 UV_tes;
void main()
{
gl_Position = (gl_TessCoord.x * gl_in[0].gl_Position +
gl_TessCoord.y * gl_in[1].gl_Position +
gl_TessCoord.z * gl_in[2].gl_Position );
UV_tes = gl_TessCoord.x * UV_tcs[0] + gl_TessCoord.y * UV_tcs[1];
}
在您的情况下,镶嵌基元的类型是triangle
layout (triangles, equal_spacing, cw) in;
输入变量UV_tcs
是每个顶点(而不是每个补丁)。 请参见曲面细分控制着色器 - 输出 和曲面细分评估着色器 - 输入。
in vec2 UV_tcs[];
参见Khronos OpenGL维基 - 镶嵌 - 三角形
生成并发送到TES的每个顶点都将被赋予重心坐标作为
gl_TessCoord
输入。此坐标定义此顶点在抽象三角形图块中的位置。抽象三角形补丁的 3 个顶点的重心坐标如图所示。所有其他顶点将相对于这些顶点指定。要在三个顶点中的每一个值处执行 3 个值之间的线性插值,请执行以下操作:
vec3 accum = vec3(0.0f)
accum += gl_TessCoord[0] * value[0]
accum += gl_TessCoord[1] * value[1]
accum += gl_TessCoord[2] * value[2]
这意味着属性必须根据三角形基元的重心坐标(gl_TessCoord.xyz
)进行插值,与属性的类型无关。你必须像对位置(gl_in[].gl_Position
)一样做,像这样更改你的代码:
UV_tes =
gl_TessCoord.x * UV_tcs[0] +
gl_TessCoord.y * UV_tcs[1] +
gl_TessCoord.z * UV_tcs[2];
相关文章:
- 我的固定时间步长与增量时间和插值的解决方案是错误的吗?
- 将使用太多的纹理插值器 - 带旋转的着色器
- 升压插值条件变量可以虚假唤醒吗?
- 如何获得插值极坐标?
- 如何线性插值到不恒定的目的地
- 向心Catmull-Rom样条曲线插值alpha参数
- 使用 OpenGL 插值数据缓冲区?
- 缩放和插值数组
- 骨骼动画:变换矩阵(collada)之间的插值
- 从一组点C++平面插值
- 从 C++14 到 C++98 的端口字符串插值
- 将矢量的数据扩展到指定大小(插值)
- 双线性插值实现的错误
- 如何避免线性插值"trap"?
- 使用 DirectX 11 插值背景颜色?
- OpenGL 缺陷 - 不需要的插值
- 如何在三角形曲面细分评估着色器中插值 UV 映射坐标?
- 将 N 个公式替换为一个(字符串插值)
- C++ - 处理几何插值中的浮点误差
- D3D11/C++ 像素着色器中 UV 插值的不准确性.如何避免