欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

5.Shader

程序员文章站 2024-03-16 17:44:40
...

1.使用in、out关键字声明shader中的输入和输出变量

    为输入变量传值有两种方式:

        (1)在着色器中声明变量时使用location = t关键字指定顶点属性位置(顶点着色器需要提供一个额外的layout标识),在程序中通过t进行赋值

        (2)在程序中使用glGetAttribLocation(变量名)获取变量的地址,然后再进行赋值

2.在顶点着色器和片元着色器之间传值:

    如果我们打算从一个着色器向另一个着色器发送数据,在发送方着色器声明一个输出变量,在接收方着色器声明一个输入变量,当两个变量名字和类型一样时,OpenGL就会将两个变量链接在一起

const char * vertexShaderSource =
       "#version 330 core\n"
       "layout(location = 0) in vec3 aPos;\n"     
       "out vec4 vertexColor;\n"
       "void main(){\n"
       "gl_Position = vec4(aPos.x,aPos.y,aPos.z,1.0f);\n"
       "vertexColor = vec4(0.5,0.0,0.0,1.0);\n"
       "}\0";
const char* fragementShaderSource =
       "#version 330 core\n"
       "out vec4 FragColor;\n"
       "in vec4 vertexColor;"
       "void main(){\n"
       "FragColor = vertexColor;\n"
       "}";

3.uniform变量,uniform变量是从CPU应用向GPU发送数据的一种方式,uniform变量有以下两个特点:

    (1)uniform变量是全局变量,在所有着色器中都是独一无二的,而且可以被着色器程序的任意着色器在任意阶段访问

    (2)uniform会一直保存变量的数据,直到被更新或重置

定义uniform变量并赋值:(注意赋值前必须先使用程序)

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

main()
{
    //当变量不存在时返回-1
    int mycolorLocation = glGetUniformLocation(shaderProgram,"mycolor");
    glUniform4f(mycolorLocation,0.0f,color,0.0f,1.0f);
}

4.使用多个顶点属性,同webGL

推荐阅读