问题描述
我正在用 C++ 制作模型查看器,并尝试使用顶点、片段和几何着色器在我的模型上可视化我的向量范数,但是它只在屏幕上显示几行而不是每个向量一行,这里是我的着色器代码:
//Create vertex shader for visnorm
const GLchar* vertexShaderVN =
"#version 410\n " \
"attribute vec3 a_Position; " \
"attribute vec3 in_normal; " \
" " \
"out VS_OUT { " \
"vec3 normal; " \
"} vs_out; " \
"uniform mat4 u_View; " \
"uniform mat4 u_Model; " \
"void main() " \
"{ " \
"gl_Position = u_View * u_Model * vec4(a_Position,1.0); " \
"mat3 normalMatrix = mat3(transpose(inverse(u_View * u_Model))); " \
"vs_out.normal = normalize(vec3(vec4(normalMatrix * in_normal,0.0))); " \
"} " \
" ";
//Create geometry shader for visnorm
const GLchar* geometryShaderVN =
"#version 410\n " \
"layout (triangles) in;" \
"layout (line_strip,max_vertices = 6) out;" \
"in VS_OUT {" \
"vec3 normal;" \
"} gs_in[];" \
"const float MAGNITUDE = 1.0; " \
"uniform mat4 u_Projection; " \
"void GenerateLine(int index)" \
"{" \
"gl_Position = u_Projection * gl_in[index].gl_Position;" \
"EmitVertex();" \
"gl_Position = u_Projection * (gl_in[index].gl_Position + vec4(gs_in[index].normal,0.0) * MAGNITUDE); " \
"EmitVertex();" \
"EndPrimitive();" \
"}" \
"void main()" \
"{" \
"GenerateLine(0);" \
"GenerateLine(1);" \
"GenerateLine(2);" \
"}" \
"";
//Create fragment shader for no visnorm
const GLchar* fragmentShaderSrcVN =
"#version 410\n " \
"out vec4 FragColor;" \
"void main()" \
"{ " \
"FragColor = vec4(1.0,1.0,0.0,1.0);" \
"} " \
" ";
gluint programIdVN = LoadShader(vertexShaderVN,geometryShaderVN,fragmentShaderSrcVN);
以及我用于加载所述着色器的代码:
gluint LoadShader(const GLchar* vert,const GLchar* geo,const GLchar* frag)
{
//Create a new vertex shader,attach source code,compile it and check for errors
gluint vertexShaderId = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShaderId,1,&vert,NULL);
glCompileShader(vertexShaderId);
GLint success = 0;
glGetShaderiv(vertexShaderId,GL_COMPILE_STATUS,&success);
//display any errors that occur in the vertex shader
if (!success)
{
GLint maxLength = 0;
glGetShaderiv(vertexShaderId,GL_INFO_LOG_LENGTH,&maxLength);
std::vector<GLchar> errorLog(maxLength);
glGetShaderInfoLog(vertexShaderId,maxLength,&maxLength,&errorLog.at(0));
std::cout << &errorLog.at(0) << std::endl;
throw std::exception();
}
//Create a new geometry shader,compile it and check for errors
gluint geometryShaderId = glCreateShader(GL_GEOMETRY_SHADER);
glShaderSource(geometryShaderId,&geo,NULL);
glCompileShader(geometryShaderId);
glGetShaderiv(geometryShaderId,&success);
//display any errors that occur in the vertex shader
if (!success)
{
GLint maxLength = 0;
glGetShaderiv(geometryShaderId,&maxLength);
std::vector<GLchar> errorLog(maxLength);
glGetShaderInfoLog(geometryShaderId,&errorLog.at(0));
std::cout << &errorLog.at(0) << std::endl;
//throw std::exception();
}
//Create a new fragment shader,compile it and check for errors
gluint fragmentShaderId = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShaderId,&frag,NULL);
glCompileShader(fragmentShaderId);
glGetShaderiv(fragmentShaderId,&success);
//display any errors that occur in the fragment shader
if (!success)
{
GLint maxLength = 0;
glGetShaderiv(fragmentShaderId,&maxLength);
std::vector<GLchar> errorLog(maxLength);
glGetShaderInfoLog(fragmentShaderId,&errorLog.at(0));
std::cout << &errorLog.at(0) << std::endl;
throw std::exception();
}
//Create new shader program and attach our shader objects
gluint programId = glCreateProgram();
glAttachShader(programId,vertexShaderId);
glAttachShader(programId,geometryShaderId);
glAttachShader(programId,fragmentShaderId);
//Ensure the VAO "position" attribute stream gets set as the first position during the link.
glBindAttribLocation(programId,"a_Position");
glBindAttribLocation(programId,"a_Texcord");
glBindAttribLocation(programId,2,"in_normal");
//Perform the link and check for failure
glLinkProgram(programId);
glGetProgramiv(programId,GL_LINK_STATUS,&success);
if (!success)
{
GLint maxLength = 0;
glGetProgramiv(programId,&maxLength);
std::vector<GLchar> errorLog(maxLength);
glGetProgramInfoLog(programId,&errorLog.at(0));
std::cout << &errorLog.at(0) << std::endl;
//throw std::exception();
}
//Detach and destroy the shader objects. These are no longer needed because we Now have a complete shader program
glDetachShader(programId,vertexShaderId);
glDeleteShader(vertexShaderId);
glDetachShader(programId,geometryShaderId);
glDeleteShader(geometryShaderId);
glDetachShader(programId,fragmentShaderId);
glDeleteShader(fragmentShaderId);
//Find uniform locations
GLint colorloc = glGetUniformlocation(programId,"u_Texcord");
GLint modelLoc = glGetUniformlocation(programId,"u_Model");
GLint viewLoc = glGetUniformlocation(programId,"u_View");
GLint projectionLoc = glGetUniformlocation(programId,"u_Projection");
if (modelLoc == -1)
{
throw std::exception();
}
if (projectionLoc == -1)
{
throw std::exception();
}
return programId;
}
如果有人对为什么这不能按预期工作有任何想法,那就太感谢了!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)