镶嵌着色器实现中的简单问题

时间:2020-05-14 20:15:36

标签: c opengl glsl shader

我尝试使用镶嵌着色器渲染三角形。现在,如果没有镶嵌细分着色器,则三角形可以很好地渲染。一旦添加了曲面细分着色器,就会出现空白屏幕。我还在glPatchParameteri(GL_PATCH_VERTICES,3)之前写了glDrawArrays(GL_PATCHES,0,3)

以下是着色器:

VERTEX SHADER:

#version 440 core

layout (location = 0) in  vec2 apos;
out vec2 pos;

void main()
{
    //gl_Position = vec4(apos,1.0f,1.0f);  without tessellation shaders
    pos = apos;
}


推特控制控件

#version 440 core

layout (vertices = 3) out;
in vec2 pos[];
out vec2 EsPos[];
void main()
{
    EsPos[gl_InvocationID] = pos[gl_InvocationID];
    gl_TessLevelOuter[0] = 3.0f;
    gl_TessLevelOuter[1] = 3.0f;
    gl_TessLevelOuter[2] = 3.0f;
    gl_TessLevelInner[0] = 3.0f;
}

地形评估着色器

#version 440 core

layout (triangles, equal_spacing, ccw) in;
in vec2 EsPos[];
vec2 finalpos;

vec2 interpolate2D(vec2 v0, vec2 v1);

void main()
{
    finalpos = interpolate2D(EsPos[0],EsPos[1]);
    gl_Position = vec4(finalpos,0.0f,1.0f);
}
vec2 interpolate2D(vec2 v0, vec2 v1)
{
    return (vec2(gl_TessCoord.x)*v0 + vec2(gl_TessCoord.y)*v1);
}

片段着色器

#version 440 core

out vec4 Fragment;

void main()
{
    Fragment = vec4(0.0f,1.0f,1.0f,1.0f);
}

编辑:

我对interpolate2D函数进行了更改,但仍然出现空白屏幕。

1 个答案:

答案 0 :(得分:1)

Tessellation Evaluation shader的输出补丁大小为3:

layout (vertices = 3) out;

因此,Tessellation Control Shader的输入数组的长度也为3。此外,abstract patch类型为triangles

layout (triangles, equal_spacing, ccw) in;

因此镶嵌坐标(gl_TessCoord)是Barycentric coordinate。更改插值:

vec2 interpolate2D(vec2 v0, vec2 v1, vec2 v2)
{
    return v0*gl_TessCoord.x + v1*gl_TessCoord.y + v2*gl_TessCoord.z;
}
void main()
{
    finalpos = interpolate2D(EsPos[0], EsPos[1], EsPos[2]);

    // [...]
}
相关问题