我开始使用曲面细分并在开始时遇到一些问题。我尝试使用曲面细分渲染由两个三角形组成的四边形,但屏幕上没有任何内容。但是,只要我删除细分着色器并再次将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 );
我尝试使用in
和out
变量而不是gl_in/out
,但这也不起作用。我也在没有TCS的情况下尝试过。
我也在使用Apitrace查找任何错误,但没有。函数loadShader()
查找编译错误。
那么什么可能导致这个问题呢?我真的不知道如何进一步调试这个东西。