opengl getUniformLocation
Posted
技术标签:
【中文标题】opengl getUniformLocation【英文标题】: 【发布时间】:2016-08-18 16:36:23 【问题描述】:我无法在我的 opengl 着色器中找到我的制服的正确位置。我总是但总是从 glGetUniformLocation 函数返回 -1。
可能是我没加载好?
我在网上看到制服可以针对不使用它们进行优化,但我使用制服的方式确实会影响我的着色器(或者我认为我会)。 此外,每次我在 *** 或其他网站上遇到与此问题相关的答案时,他们都会谈论这个事实,但没有人解释对此的替代解决方案,这真的让我很挣扎。它是新的 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已经为此苦苦挣扎了好几天...希望有人可以在这里救我:
codeHere
如果您只需要我所说的特定部分:
//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 或任何其他库。他们只是把我弄糊涂了。
【问题讨论】:
您需要查看编译和链接阶段是否成功。如果没有,你就不能使用这个程序,它总是会给你-1 【参考方案1】:您在顶点着色器中拼错了统一名称:
uniform mat4 mvmatrix;
uniform mat4 projmatrix;
...
gl_Position = proj_matrix * mv_matrix * position;
要修复,请将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"
在最新版本的 cmets 中有一行:
color = vec4(1.0,0.0,0.0.1.0)
有 2 个错误。您缺少;
并且1.0
之前的字符应该是,
,而不是.
【讨论】:
没有帮助。仍然得到-1。 我前一阵子不小心换了名字。你不知道我为同样的问题苦苦挣扎了多久。 我现在确实尝试编译它,你是对的。虽然我按照你的建议做了,但它似乎得到了 GL_FALSE,所以着色器有问题,但一切似乎都很好。我检查了无数次。我也会尝试打印日志并检查问题 OK 问题不是着色器......glGetShaderIV 甚至不影响 int 的值......我将它设置为 2,然后使用该函数,它没有影响 int 的值...也许我加载错了..sec 没关系...着色器没问题,不是问题..它是别的东西。以上是关于opengl getUniformLocation的主要内容,如果未能解决你的问题,请参考以下文章