GLSL:将细分从曲面细分评估着色器移动到顶点着色器

时间:2012-07-02 21:21:59

标签: math opengl glsl

我正在使用曲面细分着色器在glsl中工作,我正在尝试进行置换贴图。它工作正常,但我想将矩阵变换代码从曲面细分评估着色器移动到顶点着色器。为什么我想在顶点着色器中使用它是因为我不想进行此计算 对于每个子三角形顶点,我希望顶点位于顶点着色器的屏幕空间中,这样我就可以决定在曲面细分控制着色器中应该细分每个三角形的数量。

不起作用的版本“几乎”正常工作,渲染三角形时会出现一些问题。

即使是可能出错的最小暗示,我也会非常感激。


这个(坏)版本有效(位置和法线在曲面细分评估着色器中转换)

// vertex shader
void main_(void)
{
    gl_Position     = VertexPosition;
    VertexTexCoord1 = VertexTexCoord;
    VertexNormal1   = VertexNormal;
}

// tessellation evaluation shader
void main_()
{
    VertexTexCoord3     =    interpolate(VertexTexCoord2);
    vec3 normal         =    interpolate(VertexNormal2);
    vec4 pos            =    interpolate(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_in[2].gl_Position);

    vec4 movement       =    vec4(normal * (texture2D(heigthMap,VertexTexCoord3).r), 0.0);

    gl_Position         =    mvpMatrix * (pos + movement);
}

此版本不起作用(位置和法线在顶点着色器中变换)

// vertex shader
void main(void)
{
    gl_Position     = mvpMatrix * VertexPosition;
    VertexTexCoord1 = VertexTexCoord;
    VertexNormal1   = mat3(mvpMatrix) * VertexNormal;
}

// tessellation evaluation shader
void main()
{
    VertexTexCoord3     =    interpolate(VertexTexCoord2);
    vec3 normal         =    interpolate(VertexNormal2);
    vec4 pos            =    interpolate(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_in[2].gl_Position);

    vec4 movement       =    vec4(normal * (texture2D(heigthMap,VertexTexCoord3).r), 0.0);

    gl_Position         =    (pos + movement);
}

1 个答案:

答案 0 :(得分:3)

在“非工作”版本中,tesselation着色器中的最后一行似乎不正确。你忘了在源变体中你有'移动'乘以mvpMatrix。

我本来试图用这个:

// tessellation evaluation shader
void main()
{
    VertexTexCoord3     =    interpolate(VertexTexCoord2);
    vec3 normal         =    interpolate(VertexNormal2);
    vec4 pos            =    interpolate(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_in[2].gl_Position);

    vec4 movement       =    vec4(normal * (texture2D(heigthMap,VertexTexCoord3).r), 0.0);

    /// This multiplication by mvpMatrix is inevitable
    gl_Position         =    (pos + mvpMatrix * movement);
}

很抱歉,如果我混合了阶段的顺序,但上面的代码(两个版本)肯定是不相同的。