细分曲面着色器实现中的简单问题

问题描述 投票:0回答:1

我尝试使用镶嵌着色器渲染三角形。现在,如果没有曲面细分着色器,则三角形可以很好地渲染。一旦添加了曲面细分着色器,就会出现空白屏幕。我还在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;
}


TESSELLATION CONTROL SHADER

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

TESSELLATION EVALUATE SHADER

#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);
}
c opengl glsl shader
1个回答
0
投票

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

    // [...]
}
© www.soinside.com 2019 - 2024. All rights reserved.