1

我正在使用 tessellation-shaders 在 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);
}
4

1 回答 1

3

在“非工作”版本中,镶嵌着色器的最后一行似乎不正确。您忘记了在源变量中您将“运动”乘以 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);
}

对不起,如果我混合了阶段的顺序,但上面的代码(两个版本)绝对是不等价的。

于 2012-07-02T21:28:31.023 回答