gpt4 book ai didi

c++ - 为什么 Tessellation control shader 被多次调用?

转载 作者:行者123 更新时间:2023-11-28 07:13:33 24 4
gpt4 key购买 nike

我的问题是,所有 Tesellation Control Shader Invocation 都会产生相同的结果,为什么 OPENGL 必须为每个补丁多次调用此着色器。例如:My Tesellation Control Shader 计算贝塞尔曲面的控制点。它采用三个顶点的数组,这些顶点是早些时候从顶点着色器聚合而来的。

// attributes of the input CPs
in vec3 WorldPos_CS_in[];

我的补丁大小是 3,所以 Tesellation Control Shader 为相同的输入调用了三次,保存为 gl_invocatinoID,然后它们都产生相同的以下控制点:

struct OutputPatch                                                                               
{
vec3 WorldPos_B030;
vec3 WorldPos_B021;
vec3 WorldPos_B012;
vec3 WorldPos_B003;
vec3 WorldPos_B102;
vec3 WorldPos_B201;
vec3 WorldPos_B300;
vec3 WorldPos_B210;
vec3 WorldPos_B120;
vec3 WorldPos_B111;
vec3 Normal[3];
vec2 TexCoord[3];
};

// attributes of the output CPs
out patch OutputPatch oPatch;

而且,还有帮助 OpenGL 将此补丁划分为 segmentation 坐标的相同信息:

 // Calculate the tessellation levels       
gl_TessLevelOuter[0] = gTessellationLevel;
gl_TessLevelOuter[1] = gTessellationLevel;
gl_TessLevelOuter[2] = gTessellationLevel;
gl_TessLevelInner[0] = gTessellationLevel;

很明显,所有 Tes Control Shader 都做同样的工作。会不会浪费资源?为什么要为每个补丁调用一次 Tesellation Control Shader?

最佳答案

好吧,控制着色器调用不会产生完全相同的结果,因为每次调用的控制点输出明显不同。但这是迂腐的。

在你的程序中,在我目前的所有程序中,是的,控制着色器对每个控制点做完全相同的事情,并且曲面 segmentation 级别没有改变。

但假设您让着色器为每个控制点生成新属性,纹理法线或其他什么?然后着色器将为每个生成不同的结果。如果需要,能有额外的灵 active 真是太好了。

现代 GPU 尝试尽可能多地并行处理。较旧的几何着色器一次调用生成多个输出。在现代 GPU 上,多次调用每次生成一个输出会更加高效。

关于c++ - 为什么 Tessellation control shader 被多次调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20590381/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com