OpenGL Tessellation不会渲染

时间:2015-07-17 13:07:21

标签: c++ opengl tessellation

我开始使用曲面细分并在开始时遇到一些问题。我尝试使用曲面细分渲染由两个三角形组成的四边形,但屏幕上没有任何内容。但是,只要我删除细分着色器并再次将GL_PATCHES更改为GL_TRIANGLES,它就会重新开始工作,而不会显示细分。

所以这是设置曲面细分着色器的代码:

glPatchParameteri(GL_PATCH_VERTICES, 3);
shaderID = glCreateProgram();
{
    vertex = GraphicsUtilities::loadShader("D:\\vert.glsl", GL_VERTEX_SHADER);
    glAttachShader(shaderID, vertex);


    fragment = GraphicsUtilities::loadShader("D:\\frag.glsl", GL_FRAGMENT_SHADER);          
    glAttachShader(shaderID, fragment);

    tcs = GraphicsUtilities::loadShader("D:\\tcs.glsl", GL_TESS_CONTROL_SHADER);
    glAttachShader(shaderID, tcs);

    tes = GraphicsUtilities::loadShader("D:\\tes.glsl", GL_TESS_EVALUATION_SHADER);
    glAttachShader(shaderID, tes);
}
glLinkProgram(shaderID);

这是顶点着色器:

   #version 400

layout(location=0) in vec4 vertPosition;
layout(location=1) in vec2 vertUV;
layout(location=2) in vec3 vertNormal;

void main(void){            
    gl_Position = vertPosition; 
}

TCS:

#version 400
layout (vertices = 3) out;

void main()
{
    gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;

    gl_TessLevelOuter[0] = 3.0;
    gl_TessLevelOuter[1] = 3.0;
    gl_TessLevelOuter[2] = 3.0;
    gl_TessLevelInner[0] = 3.0;
}

TES:

#version 400
layout(triangles, equal_spacing, cw) in;

void main()
{
    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);
}

这就是我绘制四边形的方式:

glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
glUseProgram(shaderID); 
glBindVertexArray(quad->getVboID());

glDrawElements(GL_PATCHES, 6, GL_UNSIGNED_INT, (GLvoid*)0);

glBindVertexArray(0);

glUseProgram(0);
glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );

我尝试使用inout变量而不是gl_in/out,但这也不起作用。我也在没有TCS的情况下尝试过。 我也在使用Apitrace查找任何错误,但没有。函数loadShader()查找编译错误。 那么什么可能导致这个问题呢?我真的不知道如何进一步调试这个东西。

0 个答案:

没有答案