OpenGL学习笔记《三》简单的shader

  前面的文章中有提到,要绘制出简单的图形,咱们须要提供顶点着色器和片断着色器。在前面绘制三角形和矩形的过程当中,顶点着色器处理了咱们输入的顶点坐标数据,而后片断着色器是固定输出了颜色。git

  如今,咱们经过必定的方法,让片断着色器能够输出不一样的颜色,这个方法就是借助:uniform关键词。github

  在片断着色器中,咱们将在变量声明前面加上uniform关键词,就能在外部调整这个变量的值,从而影响到着色器程序的运行效果:函数

const char* fragmentShaderSource = "#version 330 core\n"
        "out vec4 FragColor;\n"
        "uniform vec4 u_color;\n"
        "void main()\n{"
        "    FragColor = u_color;\n"
        "}\0";

  上述片断着色器代码中,u_color变量前面加上了uniform关键词,而后将这个变量赋值给FragColor,这样片断着色器输出的颜色,就由u_color的值决定。this

  那么如何给uniform声明的变量赋值?spa

  首先,咱们须要找到这个变量的索引:code

glGetUniformLocation(shaderProgram2, "u_color")

  glGetUniformLocation方法,参数1为咱们建立的着色器程序的索引ID,参数2为uniform变量的名字,该方法返回该变量的索引,若是返回的是-1,说明该变量不存在。orm

  获取到了位置以后,咱们就能够给该变量赋值了:blog

glUniform4f(uniformLocation, 0.0f, 1.0f, 0.0f, 1.0f);

  由于opengl是c实现的,没有函数的重载功能。可是咱们知道变量有多种类型,像float、int等,因此只能建立各类命名为glUniformxxx的函数,来针对各类不一样类型的变量进行赋值处理,在这里咱们的uniform变量的类型是vec4,即4个浮点类型的数据,因此咱们用到的函数是glUniform4f,参数1是咱们前面找到的变量地址,后面4个值就对应vec4的4个值了。索引

  要使咱们的赋值生效,咱们须要在调用赋值方法以前,先调用glUseProgram方法。rem

  另外须要注意的是,若是咱们在着色器代码中声明了uniform类型的变量,可是在代码中又没有用到这个变量,那么着色器编译的时候就会去掉这个变量,就致使咱们在想改变这个变量值的时候,发现改变不了。这个是须要咱们注意的。原文做者的话是:If you declare a uniform that isn't used anywhere in your GLSL code the compiler will silently remove the variable from the compiled version which is the cause for several frustrating errors; keep this in mind! 我以为应该就是我说的意思。

  对应的代码在这里

相关文章
相关标签/搜索