细分后为什么不显示我的三角形?的OpenGL

米哈尔566

我开始学习opengl,并且我处于镶嵌细分阶段,但是我遇到了问题,当我将镶嵌细分着色器附加到程序中时,三角形将不会显示。着色器正确编译,没有链接错误。从代码方面看,一切似乎都很好。当我仅使用顶点着色器和片段着色器时,一切正常。可能是什么原因?

Shaders::Shaders(const char* vertexPath, const char* fragmentPath, const char* tessControlPath, const char* tessEvaluationPath)
{
    std::string vs_str = load_file(vertexPath);
    std::string fs_str = load_file(fragmentPath);
    std::string tc_str = load_file(tessControlPath);
    std::string te_str = load_file(tessEvaluationPath);
    const char* vs_src = vs_str.c_str();
    const char* fs_src = fs_str.c_str();
    const char* tc_src = tc_str.c_str();
    const char* te_src = te_str.c_str();

    create_shader(GL_VERTEX_SHADER, vertexShader, vs_src);
    create_shader(GL_FRAGMENT_SHADER, fragmentShader, fs_src);
    create_shader(GL_TESS_CONTROL_SHADER, tessControlShader, tc_src);
    create_shader(GL_TESS_EVALUATION_SHADER, tessEvaluationShader, te_src);

    program = glCreateProgram();
    glAttachShader(program, vertexShader);
    glAttachShader(program, fragmentShader);
    glAttachShader(program, tessControlShader);
    glAttachShader(program, tessEvaluationShader);
    glLinkProgram(program);

    glDeleteShader(vertexShader);
    glDeleteShader(fragmentShader);
    glDeleteShader(tessControlShader);
    glDeleteShader(tessEvaluationShader);

    glCreateVertexArrays(1, &vertexArrayObject);
    glBindVertexArray(vertexArrayObject);
}
void Shaders::create_shader(GLenum type, GLuint& shader, const char* src)
{
    GLint isCompiled = 0;
    shader = glCreateShader(type);
    glShaderSource(shader, 1, &src, nullptr);
    glCompileShader(shader);
    glGetShaderiv(shader, GL_COMPILE_STATUS, &isCompiled);
    if (isCompiled == GL_FALSE)
    {
        GLint maxLength = 0;
        glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &maxLength);
        std::vector<GLchar> errorLog(maxLength);
        glGetShaderInfoLog(shader, maxLength, &maxLength, &errorLog[0]);
        for (int i = 0; i < errorLog.size(); i++)
        {
            std::cerr << errorLog[i];
        }
        glDeleteShader(shader);
    }
}

int main()
{
    Window* window = new Window(1200, 1000);
    Shaders* shader = new Shaders("shaders/vertex.glsl", "shaders/fragment.glsl", "shaders/tess_control.glsl", "shaders/tess_evaluation.glsl");

    while (glfwWindowShouldClose(window->get_window()) == false)
    {
        window->loop();
        const GLfloat color[]{1.0f, 0.5f, 0.5f, 1.0f};
        glClearBufferfv(GL_COLOR, 0, color);

        const GLfloat attrib[]{0.0f, 0.0f, 1.0f, 1.0f};

        glUseProgram(shader->get_program());
        glVertexAttrib4fv(0, attrib);

        glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
        glDrawArrays(GL_PATCHES, 0, 3);
    }

    delete window;
    delete shader;
    glfwTerminate();
}

顶点

#version 450 core

layout (location = 0) in vec4 color;

out VS_OUT
{ 
    vec4 color;
} vs_out;

void main(void)
{
    const vec4 vertices[3] = vec4[3](vec4( 0.25, -0.25, 0.5, 1.0), vec4(-0.25, -0.25, 0.5, 1.0), vec4(0.25, 0.25, 0.5, 1.0));

    gl_Position = vertices[gl_VertexID];
    vs_out.color = color;
}

片段

#version 450 core

in VS_OUT
{
    vec4 color;
} fs_in;

out vec4 color;

void main(void)
{
    color = fs_in.color;
}

tess_control.glsl

#version 450 core

layout (vertices = 3) out;

void main(void)
{
    if (gl_InvocationID = 0)
    {
        gl_TessLevelInner[0] = 5.0;
        gl_TessLevelOuter[0] = 5.0;
        gl_TessLevelOuter[1] = 5.0;
        gl_TessLevelOuter[2] = 5.0;
    }
    gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
}

tess_evaluation.glsl

#version 450 core

layout (triangles, equal_spacing, ccw) in;

void main(void)
{
    gl_Position = (gl_TessCoord.x * gl_in[0].gl_Position + gl_TessCoord.y * gl_in[1].gl_Position + gl_TessCoord.z * gl_in[2].gl_Position);
}
拉比德76

您已通过以下方式指定了用于构成单个面片基元的顶点数量glPatchParameteri

glPatchParameteri(GL_PATCH_VERTICES, 3);
glDrawArrays(GL_PATCHES, 0, 3);

此外,您还必须从顶点着色器到片段着色器,贯穿所有着色器阶段,一路传递颜色:

Tessellation控制着色器的输入是补丁,而输出也是补丁。但是输入补丁大小可以与输出补丁大小不同。当输入补丁大小由定义时GL_PATCH_VERTICES,输出补丁大小由定义layout (vertices = 3) out因此,您必须在着色器程序中指定如何将输入面片的属性映射到输出面片的属性。

#version 450 core

layout (vertices = 3) out;

in VS_OUT
{ 
    vec4 color;
} in_data[];

out VS_OUT
{ 
    vec4 color;
} out_data[];

void main(void)
{
    out_data[gl_InvocationID].color = in_data[gl_InvocationID].color;
    if (gl_InvocationID = 0)
    {
        gl_TessLevelInner[0] = 5.0;
        gl_TessLevelOuter[0] = 5.0;
        gl_TessLevelOuter[1] = 5.0;
        gl_TessLevelOuter[2] = 5.0;
    }
    gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
}

镶嵌评价着色器进行内插。细分控制着色器的输出面片的属性取决于gl_TessCoord
您必须实现在着色器程序中插入属性的算法。

#version 450 core

layout (triangles, equal_spacing, ccw) in;

in VS_OUT
{ 
    vec4 color;
} in_data[];

out VS_OUT
{ 
    vec4 color;
} out_data;

void main(void)
{
    out_data.color = in_data[0].color * gl_TessCoord.x + in_data[1].color * gl_TessCoord.y + in_data[2].color * gl_TessCoord.z;
    gl_Position = (gl_TessCoord.x * gl_in[0].gl_Position + gl_TessCoord.y * gl_in[1].gl_Position + gl_TessCoord.z * gl_in[2].gl_Position);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我的三角形是白色的?

来自分类Dev

Sierpinski三角形:不显示

来自分类Dev

C OpenGL glfw3三角形不显示

来自分类Dev

OpenGL 绘图三角形不显示 + glClearColor 不设置屏幕颜色

来自分类Dev

为什么这个 OpenGL 示例不绘制三角形?

来自分类Dev

为什么我会在屏幕上显示一半的三角形?

来自分类Dev

为什么我不能在Qt小部件上绘制三角形

来自分类Dev

为什么我的列表视图带有三角形标记?

来自分类Dev

为什么glDrawElements无法渲染我的三角形?

来自分类Dev

为什么在带有OpenGL核心配置文件的窗口上看不到我的红色三角形?

来自分类Dev

为什么此最少的代码无法使用OpenGL ES 1.1绘制纹理三角形?

来自分类Dev

订购角度数据表而不显示用户交互三角形

来自分类Dev

OpenGL:创建彩色三角形

来自分类Dev

OpenGL不渲染三角形

来自分类Dev

OpenGL三角形邻接索引

来自分类Dev

OpenGL拒绝绘制三角形

来自分类Dev

无法使简单的OpenGL三角形旋转

来自分类Dev

OpenGL GLFW,三角形不渲染

来自分类Dev

OpenGL三角形旋转错误

来自分类Dev

OpenGL三角形未绘制

来自分类Dev

OpenGL三角形未渲染

来自分类Dev

Delphi OpenGL三角形不旋转

来自分类Dev

OpenGL绘制三角形

来自分类Dev

无法在OpenGL中绘制三角形

来自分类Dev

用OpenGL渲染意外的三角形

来自分类Dev

使用 OpenGL 绘制基本三角形

来自分类Dev

OpenGL仅显示12个三角形中的3个

来自分类Dev

OpenGL程序没有显示三角形

来自分类Dev

如何使用 OpenGL 在屏幕上显示三角形?