gpt4 book ai didi

c++ - 通过曲面 segmentation 着色器将数据传递到片段着色器

转载 作者:可可西里 更新时间:2023-11-01 18:26:33 36 4
gpt4 key购买 nike

我对着色器管道如何在每个阶段传递数据感到困惑。

我想做的是将使用 glVertexAttrib4fv() 在顶点阶段加载的颜色数据传递给 segmentation 控制着色器,然后是 segmentation 评估着色器,这样它就可以在片段着色器中使用。我不确定我是否犯了某种概念性错误(很有可能,因为我仍在尝试通过固定功能解决这个问题),但无论哪种方式,只要我尝试通过曲面 segmentation 着色器,我的基元根本拒绝渲染。在此之前,我的原语渲染,但它只渲染成黑色。我的着色器如下:

顶点着色器:

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"
};

曲面 segmentation 控制着色器:

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"
"}"
};

曲面 segmentation 评估着色器:

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 [];

或者在同样采用无界数组形式的输入/输出 block 中:

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 [];

为了尽可能简单,我将避免使用界面 block 。

相反,我将介绍逐 block 输入和输出的概念,因为它们会进一步简化您的着色器,因为考虑到整个曲面 segmentation 表面的颜色是恒定的...

修改后的曲面 segmentation 控制着色器:

      in  vec4 vs_color [];
patch out vec4 patch_color;

...

patch_color = vs_color [gl_InvocationID];

修改后的曲面 segmentation 评估着色器:

patch in  vec4 patch_color;
out vec4 tes_color;

...

tes_color = patch_color;

通过这些更改,您应该对 TCS 和 TES 阶段的工作原理有一个有效的传递,并稍微更好地理解。

关于c++ - 通过曲面 segmentation 着色器将数据传递到片段着色器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20726441/

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