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

文章介绍了OpenGL着色器的基础知识,包括着色器的作用和结构,以及如何通过GLSL编写着色器。通过示例展示了如何声明版本、指定输入输出变量,并解释了location在着色器中的作用。重点讨论了如何在着色器中处理颜色和透明度,以实现绘制对象的渐变效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在学习及使用OpenGL着色器的过程中遇上了一些问题,但最终在别人的帮助下解决了,于是打算将所遇到的问题做一个总结,同时也为需要的人提供一个参考。

首先简单介绍一下OpenGL着色器,关于这个网上有很多相关资料,可以根据需要查阅,这里只是简单总结一下。简单来说,着色器在当前脚本(script)就相当于一个声明,声明你的绘制对象的维度及颜色。着色器GLSL编写,不同类型的着色器是各自独立的小程序,但最终各个着色器是会链接到一起构成一个整体程序的,例如片元着色器的输入就是顶点着色器。着色器的编写结构如下:

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"
"}";

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

以上,如果有用还请点个赞哦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值