程序纹理技术-简易多波形信号发生器电路设计

时间:2024-07-31 10:03:52
【文件属性】:

文件名称:程序纹理技术-简易多波形信号发生器电路设计

文件大小:46.65MB

文件格式:PDF

更新时间:2024-07-31 10:03:52

OpenGL ES3x 游戏开发 下卷吴 亚峰pdf

3.1 程序纹理技术 了解了砖块着色器的基本原理后,下面看看本小节案例 Sample3_1 的运行效果,如图 3-2 所示。 ▲图 3-2 案例 Sample3_1 的运行效果图 从图 3-2 中可以看出,本小节案例是针对球面应用的砖块着色器。由于构建球面的知识在上 卷的章节中已经详细介绍过,故这里仅给出与砖块着色器相关的部分代码,具体内容如下。 (1)首先在负责绘制球面的 Ball 类中,需要增加将顶点经纬度数据传入渲染管线的相关代码, 此部分代码与将顶点坐标传递进渲染管线的代码套路完全一致。因此这里不再赘述,需要的读者 请参考随书中的源代码。 (2)接下来给出的是顶点着色器,其代码如下。 代码位置:源代码/第 3 章/Sample3_1/assets 目录下的 vertex.sh。 1 #version 300 es 2 uniform mat4 uMVPMatrix; //总变换矩阵 3 in vec3 aPosition; //顶点位置 4 in vec2 aLongLat; //顶点经纬度 5 out vec2 mcLongLat; //用于传递给片元着色器的顶点经纬度 6 void main(){ 7 gl_Position = uMVPMatrix * vec4(aPosition,1);//根据总变换矩阵计算此次绘制此顶点的位置 8 mcLongLat=aLongLat; //将顶点的经纬度传给片元着色器 9 } 说明 与普通的顶点着色器相比,上述顶点着色器主要是增加了接收从管线传入的顶 点经纬度,并将其传递给片元着色器的相关代码。 (3)最后给出片元着色器,其代码如下。 代码位置:源代码/第 3 章/Sample3_1/assets 目录下的 frag.sh。 1 #version 300 es 2 precision mediump float; //给出默认的浮点精度 3 in vec2 mcLongLat; //接收从顶点着色器过来的经纬度 4 out vec4 fFragColor; //输出的片元颜色 5 void main(){ 6 vec3 bColor=vec3(0.678,0.231,0.129); //砖块的颜色 7 vec3 mColor=vec3(0.763,0.657,0.614); //水泥的颜色 8 vec3 color; //片元的最终颜色 9 int row=int(mod((mcLongLat.y+90.0)/12.0,2.0));//计算当前片元位于奇数行还是偶数行 10 float ny=mod(mcLongLat.y+90.0,12.0);//计算当前片元是否在此行区域 1 中的辅助变量 11 float oeoffset=0.0; //每行的砖块偏移值,奇数行偏移半个砖块 12 float nx; //当前片元是否在此行区域 3 中的辅助变量 13 if(ny>10.0) { //位于此行的区域 1 中 14 color=mColor; //采用水泥色着色 15 } else { //不位于此行的区域 1 中 16 if(row==1){ //若为奇数行则偏移半个砖块 17 oeoffset=11.0; 18 } 19 nx=mod(mcLongLat.x+oeoffset,22.0);//计算当前片元是否在此行区域 3 中的辅助变量 20 if(nx>20.0){ //不位于此行的区域 3 中 21 color=mColor; //采用水泥色着色 22 }else{ //位于此行的区域 3 中 23 color=bColor; //采用砖块色着色 24 }} 25 fFragColor=vec4(color,0); //将片元的最终颜色传递进渲染管线 26 }


网友评论