opengl getUniformLocation

opengl getUniformLocation

本文关键字:getUniformLocation opengl      更新时间:2023-10-16

我在我的opengl着色器中获得我的制服的适当位置时遇到了麻烦。我总是但总是得到-1从glGetUniformLocation函数返回。

也许我没有把它装好?

我在网上读到制服可以优化不使用它们,但我确实以一种可以影响我的着色器的方式使用我的制服(或者我,我认为我这样做)。此外,每次我在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)                                  
}                                                                  

和这里是整个程序的整个源代码..现在我没有实现整个代码本身,只有编译程序和着色器的部分,但是,我正在努力获得制服的位置,我已经为此挣扎了好几天…希望有人能在这里拯救我:

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/glow/freeglut或任何其他库。

你在顶点着色器中拼错了统一名称:

uniform mat4 mvmatrix;
uniform mat4 projmatrix;
...
gl_Position = proj_matrix * mv_matrix * position;

修复,将gl_Position行替换为

gl_Position = projmatrix * mvmatrix * position;

要在将来捕获类似的错误,请检查shader编译状态:

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)     

在末端缺少;。你应该检查shader编译错误。

你的片段着色器从顶点着色器输入颜色,但顶点着色器不输出它,你不使用碎片着色器的颜色输入。要进行修复,请删除这些行:

"in VS_OUT                                                          n"
"{                                                                  n"
"    vec4 color;                                                    n"
"} fs_in;                                                           n"

在注释的最新版本中有一行:

color = vec4(1.0,0.0,0.0.1.0)

有2个错误。您缺少;, 1.0之前的字符应该是,,而不是.

相关文章:
  • 没有找到相关文章