我无法在我的opengl着色器中找到合适的制服位置。我总是但总是从glGetUniformLocation函数返回-1。
也许我没有加载它?
我在网上看到,制服可以不使用它们进行优化,但我确实使用的制服会影响我的着色器(或者我,我认为我这样做)。 另外,每当我遇到与stackoverflow或其他网站上的这个问题相关的答案时,他们确实会谈到这个事实,但没有一个关于替代解决方案的解释,这真的让我苦苦挣扎。对于新的opengl迭代来说它是新的吗?
这是我的顶点着色器代码:
#version 410 core
in vec4 position;
uniform mat4 mvmatrix;
uniform mat4 projmatrix;
void main(void)
{
gl_Position = projmatrix * mvmatrix * position;
}
这是我的片段着色器代码:
#version 410 core
out vec4 color;
void main(void)
{
color = vec4(1.0,1.0,1.0,1.0)
}
这里是整个程序的完整源代码。现在我没有实现整个代码本身,只有编译程序和着色器的部分,但是,我正在努力获得制服的位置,Ive几天来一直在努力...希望有人能救我来这里:
如果您只需要我正在谈论的特定部分:
//creating program and shaders, compiling shaders, compiling program
GLchar * v_Shader[] = {
"#version 410 core \n"
" \n"
"in vec4 position; \n"
" \n"
" \n"
"uniform mat4 mvmatrix; \n"
"uniform mat4 projmatrix; \n"
" \n"
"void main(void) \n"
"{ \n"
" gl_Position = proj_matrix * mv_matrix * position; \n"
"} \n"
};
GLchar * f_Shader[] = {
"#version 410 core \n"
" \n"
"out vec4 color; \n"
" \n"
"in VS_OUT \n"
"{ \n"
" vec4 color; \n"
"} fs_in; \n"
" \n"
"void main(void) \n"
"{ \n"
" color = vec4(1.0,1.0,1.0,1.0) \n"
"} \n"
};
//creating a opengl program
program = glCreateProgram();
//creating the vertex shader and compiling it
vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, v_Shader, NULL);
glCompileShader(vertexShader);
//creating the fragment shader and compiling it
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, f_Shader, NULL);
glCompileShader(fragmentShader);
//attaching the shaders to the program and linking the program
glAttachShader(program, vertexShader);
glAttachShader(program, fragmentShader);
glLinkProgram(program);
glUseProgram(program);
//getting the program's uniform locations
modelViewMatrixLocation = glGetUniformLocation(program, "mvmatrix");
projectionMatrixLocation = glGetUniformLocation(program, "projmatrix");
不,我不喜欢使用glfw / sdl / glew / freeglut或任何其他库。他们只是让我四处迷惑。
答案 0 :(得分:1)
您在顶点着色器中错误拼写了统一名称:
uniform mat4 mvmatrix;
uniform mat4 projmatrix;
...
gl_Position = proj_matrix * mv_matrix * position;
要解决此问题,请将<{1}}行替换为
gl_Position
要在将来捕获这样的错误,请检查着色器编译状态:
gl_Position = projmatrix * mvmatrix * position;
片段着色器中也存在语法错误:
GLint wasCompiled;
glGetShaderiv( shader, GL_COMPILE_STATUS, &wasCompiled );
GLint logLength;
glGetShaderiv( shader, GL_INFO_LOG_LENGTH, &logLength );
if (logLength > 0)
{
GLchar* log = new GLchar[ (std::size_t)logLength + 1 ];
GLsizei charsWritten = 0;
glGetShaderInfoLog( shader, logLength, &charsWritten, log );
std::cout << std::string( log );
}
最后失踪color = vec4(1.0,1.0,1.0,1.0)
。您应该检查着色器编译错误。
您的片段着色器将颜色作为顶点着色器的输入,但顶点着色器不会输出它,并且您不会在片段着色器中使用颜色输入。要修复,请删除以下行:
;
在评论的最新版本中,您有一句话:
"in VS_OUT \n"
"{ \n"
" vec4 color; \n"
"} fs_in; \n"
有2个错误。您遗失color = vec4(1.0,0.0,0.0.1.0)
,;
之前的字符应为1.0
,而不是,