首页 > 其他分享 >增加颜色和着色

增加颜色和着色

时间:2024-02-01 23:01:04浏览次数:29  
标签:颜色 0.5 0.7 着色 0f 增加 顶点 三角形

一.平滑着色

  我们已经知道,在OpenGL中,我们只能画点,直线和三角形,并且所有物体都是以他们为基础构建的。既然受限于这三个基本图元,那么我们如何用许多不同的颜色和着色表达更复杂的场景呢?我们能使用的一个方法就是使用上百万个小三角形,每个三角形的颜色都不同,这样就可以看到一副美丽,复杂,有丰富颜色变化的场景。尽管,这在技术上是可行的,但性能和内存的开销是十分庞大的。所以,OpenGL提供了另外一种技术,平滑着色。举例来说,就是有一个三角形,每个顶点的颜色都是不同的,我们可以在三角形表面混合这些颜色,最终得到一个平滑着色的三角形。我们要使用这种类型的着色让桌子中央更加明亮,而桌子的边缘显得比较暗淡。

  在实现这个效果前,我们先得更新桌子的结构,我们需要在桌子中间加入一个点,这样就可以在桌子的中间和边缘之间混合颜色,更新后的桌子结构如下图所示:

  为了更好的理解平滑着色,我这里举个例子:比如,有一条直线,一个顶点A是红色的,另一个顶点B是绿色的,那么使用平滑着色后的效果就是,越靠近顶点A颜色越红,越靠近顶点B颜色越绿,也就是呈现出从红色从绿色逐渐过渡的效果。

二.引入三角形扇

  想要画出这个结构,我们需要引入三角形扇结构。一个三角形扇会以一个中心顶点作为开始,使用相邻的两个顶点创建第一个三角形,接下来每加入一个顶点,就会创建一个新的三角形,围绕中心的顶点按扇形展开,为了使这个扇形闭合,我们只需要在最后重复第二个点。三角形扇结构如下图所示:

  接下来,我们需要修改代码,在上一篇文章的基础上。我们首先需要更新顶点数组结构,修改如下:

val tableVertices=floatArrayOf(
            //Triangle fan
            0f,0f,
            -0.5f,-0.5f,
            0.5f,-0.5f,
            0.5f,0.5f,
            -0.5f,0.5f,
            -0.5f,-0.5f,
            //Mid Line
            -0.5f,0f,
            0.5f,0f,
            //Mallets
            0f,-0.25f,
            0f,0.25f,
        )

  然后,在onDrawFrame函数中,将绘制矩形的代码修改成:glDrawArrays(GL_TRIANGLE_FAN,0,6)

  运行程序,看看效果。

 三.增加一个新的颜色属性

  通过给桌子加入一个中心点,我们已经更新了桌子的结构。接下来,我们给每个顶点加入第二个属性,颜色属性,代码修改如下:

val tableVertices=floatArrayOf(
            //Triangle fan
            0f,0f,1f,1f,1f,
            -0.5f,-0.5f,0.7f,0.7f,0.7f,
            0.5f,-0.5f,0.7f,0.7f,0.7f,
            0.5f,0.5f,0.7f,0.7f,0.7f,
            -0.5f,0.5f,0.7f,0.7f,0.7f,
            -0.5f,-0.5f,0.7f,0.7f,0.7f,
            //Mid Line
            -0.5f,0f,1f,0f,0f,
            0.5f,0f,1f,0f,0f,
            //Mallets
            0f,-0.25f,0f,0f,1f,
            0f,0.25f,1f,0f,0f
        )

  接下来,我们需要修改顶点着色器代码,修改后的代码如下所示:

#version 300 es
layout(location=0) in vec4 a_Position;
layout(location=1) in vec4 a_Color;
out vec4 v_Color;
void main() {
    gl_Position=a_Position;
    v_Color=a_Color;
    gl_PointSize=10.0;
}

  片段着色器也需要修改,修改后的代码如下:

#version 300 es
precision mediump float;
in vec4 v_Color;
out vec4 fragColor;
void main() {
    fragColor=v_Color;
}

  我们在顶点着色器中加入了一个a_Color变量用于接收顶点的颜色属性,然后再借助out关键字将数据从顶点着色器传输到片段着色器。

  接下来,我们需要更新一些常量,首先加入一个常量用于记录颜色属性的分量个数,然后再加入一个变量用于存储一个顶点的位置分量和颜色分量总共占据的字节数,因为我们现在有两个属性,知道占据的总字节数,我们就能找到第二个顶点的首地址。修改如下:

companion object{
        private val POSITION_COMPONENT_COUNT=2//记录一个顶点有两个分量
        private val COLOR_COMPONENT_COUNT=3//记录颜色用三个分量表示
        private val BYTES_PER_FLOAT=4//每个浮点数4个字节
        private val STRIDE=(POSITION_COMPONENT_COUNT+ COLOR_COMPONENT_COUNT)* BYTES_PER_FLOAT//记录一个顶点的位置属性和颜色属性占有的总字节数
    }

  更新onSurfaceCreated()函数,加入STRIDE这个参数,让OpenGL知道下一个顶点的位置该怎么找,主要修改下面这行代码:

//关联属性和顶点数据的数组
glVertexAttribPointer(0, POSITION_COMPONENT_COUNT, GL_FLOAT,false,STRIDE,vertexData)

  然后,加入代码,将顶点数组中的颜色属性传给顶点着色器中的a_Color变量,在onSurfaceCreated函数末尾加入如下代码:

//给顶点着色器传入颜色属性
vertexData.position(POSITION_COMPONENT_COUNT)
glVertexAttribPointer(1, COLOR_COMPONENT_COUNT, GL_FLOAT,false,STRIDE,vertexData)
glEnableVertexAttribArray(1)

  最后,修改onDrawFrame()函数中的代码,将给uniform变量传输颜色属性的代码都删除,修改后的代码如下:

override fun onDrawFrame(p0: GL10?) {
        glClear(GL_COLOR_BUFFER_BIT)//清除帧缓冲区内容,和glClearColor一起使用
        //绘制矩形
        glDrawArrays(GL_TRIANGLE_FAN,0,6)
        //绘制分割线
        glDrawArrays(GL_LINES,6,2)
        //绘制木槌,用点表示
        glDrawArrays(GL_POINTS,8,1)
        glDrawArrays(GL_POINTS,9,1)
    }

  

 

  

 

标签:颜色,0.5,0.7,着色,0f,增加,顶点,三角形
From: https://www.cnblogs.com/luqman/p/18002168

相关文章

  • Vue 搭配GSAP实现颜色动态渐变
    重点使用reactive构造响应式的对象存储颜色,使用gsap.to操作响应式对象实现颜色渐变代码lettoTimeLine:TweenletoverTimeLine:TweentypeColor={value:string}typeTween=gsap.core.TweenconstaddItemColor=reactive<C......
  • 2、linux增加域名代替ip
    linux增加域名代替ip1、查看当前的域名配置列表cat/etc/hosts2、配置域名vi/etc/hosts/etc/hosts:192.168.0.10为当前服务器ip192.168.0.20为配置其他服务ip127.0.0.1localhostlocalhost.localdomainlocalhost4localhost4.localdomain4::1localhostl......
  • 编译着色器并在屏幕上绘图
    一.前言  本篇文章会继续上一篇文章开始的工作,在这篇文章中,我们首先会加载并编译前面定义的着色器,然后把他们链接在一起放在OpenGL的一个程序里,接下来就可以使用这个着色器程序在屏幕上绘制空气曲棍球桌子结构了。 二.加载着色器1.我们已经为着色器写了代码,下一步则要把......
  • Socket.D v2.3.9 发布(增加 node.js server 实现)
    Socket.D是基于"事件"和"语义消息""流"的网络应用层传输协议。有用户说,“Socket.D之于Socket,尤如Vue之于Js、Mvc之于Http”。支持tcp,udp,ws,kcp传输。协议特点可参考《官网介绍》。pyton已开发完成,再在测试中;go,rust,c++正在开发中。forJava适配框架更新说......
  • 使用CAShapeLayer,UIBezierPath,CAGradientLayer构建边框颜色会旋转的六边形
    主要思路是:1.使用UIBezierPath绘制一个六边形路径2.创建一个CAShapeLayer图层,将这个六边形path设置到CAShapeLayer属性上。然后设置fillColor为透明,strokeColor为黑色,lineWidth为5.03.创建一个CAGradientLayer渐变色图层,并将它的渐变类型设置成kCAGradientLayerConic以圆心为......
  • idea-Project Structre设置 Sources:显示项目的目录资源,那些是项目部署的时候需要的目
    idea-ProjectStructre设置ProjectStructreProject Projectname:定义项目的名称;ProjectSDK:设置该项目使用的JDK,也可以在此处新添加其他版本的JDK;Projectlanguagelevel:这个和JDK的类似,区别在于,假如你设置了JDK1.8,却只用到1.6的特性,那么这里可以设置语言等级为1.6,这个是......
  • WPS JS 宏根据单元格内容填充颜色
    WPSJS宏根据单元格内容填充颜色直接上代码/***Macro1Macro*宏由Steven录制,时间:2024/01/30*/functionSetCellColorsBYMacro(){ //获取表格的行数和列数varrowCount=48;varcolAll=['A','B','C','D','E',&......
  • 75. 颜色分类(中)
    目录题目法一、统计法二、冒泡排序法三、三指针题目给定一个包含红色、白色和蓝色、共n个元素的数组nums,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。我们使用整数0、1和2分别表示红色、白色和蓝色。必须在不使用库内置的sort函数......
  • [Qt-ColorEditor] Qt颜色编辑器,QColorDialog的优化版,支持RGB和HSV等多种方式选色
    外观分享一下我实现的颜色编辑器,主要原因是Qt的QColorDialog功能较少没法满足需求,目前已经在zeno中使用了,由于zeno有自己的样式表,所以在zeno里长这样:如果不加样式表的话长这样:功能srgb切换颜色轮选色颜色文字选色颜色滑动条选色,RGB和HSV上一个/当前颜色切换,这个主要......
  • Django - admin 表单编辑页面,增加自定义功能,前端上传视频到oss
    #背景:可以在admin编辑页面原有基础上,增加一些可定制的功能,如:在本地上传图片到oss,减少服务器的带宽压力,下面就以此为例。示例图:  一。models.py#video可以直接用字符串存储,因为最终里面只有有一串oss的视频路径classNews(models.Model):OSS_URL='https://xxxx......