OpenGL——着色器设置绘制对象颜色及透明度

发布时间 2023-10-08 20:37:21作者: YZFHKMS-X

 

{

https://blog.csdn.net/weixin_46568899/article/details/129217018

}

 

{

。着色器的编写结构如下:

1.声明版本(很重要,版本不对的话会得到不同的绘制结果)。

2.使用location指定输入变量。

3.定义输入输出变量(用in和out关键字)。

4.main函数。

以下是一个简单的例子:

    const char* vertexShaderSource =
            "#version 300 es\n"
            "layout (location = 0) in vec3 aPos;\n"
            "layout (location = 1) in vec3 aColor;\n"
            "out vec3 vColor;\n"
            "void main()\n"
            "{\n"
            "   vColor = aColor;\n"
            "   gl_Position = vec4(aPos, 1.0);\n"
            "}";
     
    const char* fragmentShaderSource =
            "#version 300 es\n"
            "in vec3 vColor;\n"
            "out vec4 outColor;\n"
            "void main()\n"
            "{\n"
            "   outColor = vec4(vColor, 1.0);\n"
            "}";

在代码中首先声明了着色器的版本,然后定义了位置属性,layout(locationg=0)和layout(locationg=1)分别代表了顶点着色器和片元着色器的位置属性,我个人的理解是这是声明了这个变量的内存位置属性,这个位置属性 也是函数glVertexAttribPointer()第一个参数的值。vec3就代表了接下来要输入的顶点的维度(x,y,z),二vec3 acolor代表了接下来要输入的颜色维度(r,g,b)。绘制时最终的颜色是需要设置为四维度的,最后一个维度为透明度。注意了,接下来是重点:

如果在着色器里面设置好透明度的话,接下来整个绘制对象的透明度都是固定的,如果想要实现绘制对象透明度或颜色渐变,那就不可以在片元着色器中设置颜色或透明度,代码如下:

    const char* vertexShaderSource =
    "#version 300 es\n"
    "layout (location = 0) in vec3 aPos;\n"
    "layout (location = 1) in vec4 aColor;\n"
    "out vec4 vColor;\n"
    "void main()\n"
    "{\n"
    "   vColor = aColor;\n"
    "   gl_Position = vec4(aPos, 1.0);\n"
    "}";
     
    const char* fragmentShaderSource =
    "#version 300 es\n"
    "in vec4 vColor;\n"
    "out vec4 outColor;\n"
    "void main()\n"
    "{\n"
    "   outColor = vec4(vColor);\n"
    "}";

这样,我们就可以在接下来传入的顶点的颜色信息中设置不一样的颜色或透明度了。

}