[英]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.