簡體   English   中英

將數據通過曲面細分着色器傳遞到片段着色器

[英]Passing data through tessellation shaders to the fragment shader

我對着色器管道如何通過每個階段傳遞數據感到困惑。

我想要做的是使用glVertexAttrib4fv()通過曲面細分控制着色器,然后是曲面細分評估着色器傳遞在頂點階段加載的顏色數據,以便可以在片段着色器中使用它。 我不確定我是否犯了某種概念上的錯誤(很可能,因為我仍然試圖通過固定功能來解決這個問題),但無論如何,只要我嘗試通過鑲嵌着色器,我的原始人拒絕渲染。 在此之前,我的原始渲染,但它只呈現黑色。 我的着色器如下:

頂點着色器:

static const GLchar* vss[] =
    {
        "#version 430 core                                                  \n"
        "                                                                   \n"
        "layout (location = 0) in vec4 offset;                              \n"
        "layout (location = 1) in vec4 color;                               \n"
        "                                                                   \n"
        "out vec4 vs_color;                                                 \n"
        "                                                                   \n"
        "void main(void)                                                    \n"
        "{                                                                  \n"
        "   const vec4 vertices[] = vec4[](vec4( 0.25, -0.25, -0.5, 1.0),   \n"
        "                                  vec4(-0.25, -0.25, -0.5, 1.0),   \n"
        "                                  vec4( 0.25,  0.25, -0.5, 1.0));  \n"
        "                                                                   \n"
        "   gl_Position = vertices[gl_VertexID] + offset;                   \n"
        "   vs_color = color;                                               \n"
        "}                                                                  \n"
    };

曲面細分控制着色器:

static const GLchar* tc_ss[] =
    {
        "#version 430 core                                                              \n"
        "layout (vertices = 3) out;                                                     \n"
        "in vec4 vs_color;                                                              \n"
        "out vec4 tcs_color;                                                            \n"
        "void main(void)                                                                \n"
        "{                                                                              \n"
        "   if (gl_InvocationID == 0)                                                   \n"
        "   {                                                                           \n"
        "       gl_TessLevelInner[0]    = 10.0;                                         \n"
        "       gl_TessLevelOuter[0]    = 10.0;                                         \n"
        "       gl_TessLevelOuter[1]    = 10.0;                                         \n"
        "       gl_TessLevelOuter[2]    = 10.0;                                         \n"
        "   }                                                                           \n"
        "   gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;   \n"
        "   tcs_color = vs_color;                                                       \n"
        "}"
    };

曲面細分評估着色器:

static const GLchar* te_ss[] =
    {
        "#version 430 core                                                                  \n"
        "in vec4 tcs_color;                                                                 \n"
        "out vec4 tes_color;                                                                \n"
        "layout (triangles, equal_spacing, cw) in;                                          \n"
        "void main(void)                                                                    \n"
        "{                                                                                  \n"
        "   gl_Position = (gl_TessCoord.x * gl_in[0].gl_Position +                          \n"
        "                  gl_TessCoord.y * gl_in[1].gl_Position +                          \n"
        "                  gl_TessCoord.z * gl_in[2].gl_Position);                          \n"
        "   tes_color = tcs_color;                                                          \n"
        "}"
    };

片段着色器:

static const GLchar* fss[] =
    {
        "#version 430 core      \n"
        "in vec4 tes_color;     \n"
        "out vec4 color;        \n"
        "                       \n"
        "void main(void)        \n"
        "{                      \n"
        "    color = tes_color; \n"
        "}                      \n"
    };

這並不奇怪,TCS輸入/輸出必須采用以下形式:

in  vec4 vs_color  [];
out vec4 tcs_color [];

或者在輸入/輸出塊中也采用無界數組的形式:

in CustomVertex {
  vec4 color;
} custom_vs [];

out CustomVertex {
  vec4 color;
} custom_tcs [];

對於一些上下文,這是TCS /幾何着色器看作頂點着色器輸出的內容:

in gl_PerVertex
{
  vec4  gl_Position;
  float gl_PointSize;
  float gl_ClipDistance [];
} gl_in [];

為了使事情盡可能簡單,我將避免使用接口塊。

相反,我將介紹每個補丁輸入和輸出的概念,因為考慮到整個鑲嵌表面的顏色是恆定的,它們將進一步簡化着色器......

修改的曲面細分控制着色器:

      in  vec4 vs_color [];
patch out vec4 patch_color;

...

  patch_color = vs_color [gl_InvocationID];

修改的曲面細分評估着色器:

patch in  vec4 patch_color;
      out vec4 tes_color;

...

  tes_color = patch_color;

通過這些更改,您應該有一個有效的傳遞,並且對TCS和TES階段的工作方式有一點了解。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM