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的主要内容,如果未能解决你的问题,请参考以下文章

[OpenGL红宝书]第一章 OpenGL概述

OpenGL版本与OpenGL扩展机制

OpenGL ES 2.x 与 OpenGL 兼容

glfw 包含了opengl吗

OpenGL ES 与 OpenGL [关闭]

qt opengl的图形怎么刷新