CSharpGL(10)两个纹理叠加
CSharpGL(10)两个纹理叠加
本文很简单,只说明如何用shader实现叠加两个纹理的效果。

另外,最近CSharpGL对渲染框架做了修改,清理一些别扭的内容(DoRender()前后的事件都去掉了,明确了Renderer的概念)。本文顺带也成了对新框架的一个应用过程的例子。
下载
这个示例是CSharpGL的一部分,CSharpGL已在GitHub开源,欢迎对OpenGL有兴趣的同学加入(https://github.com/bitzhuwei/CSharpGL)
先写shader
Shader是算法,VBO是数据结构。数据结构常有,而算法不常有。先写shader,万事可定。
Vertex shader
顶点shader用来设定顶点位置,传递贴图的UV坐标到fragment shader。
#version core in vec3 in_Position;
in vec2 in_UV;
out vec2 pass_UV; uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform mat4 modelMatrix; void main(void)
{
gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(in_Position, 1.0); pass_UV = in_UV;
}
Fragment shader
片段shader根据UV坐标获取两个贴图上的颜色,然后按指定比例叠加。
#version core in vec2 pass_UV;//从vertex shader传来的UV坐标
out vec4 out_Color;//fragment shader的输出,名字不必是out_Color
uniform sampler2D texture1;
uniform sampler2D texture2;
uniform float percent;//叠加比例 void main(void)
{
out_Color = texture(texture1, pass_UV) * percent + texture(texture2, pass_UV) * (1.0 - percent);
}
后写Renderer
一个Renderer对应一个(vertex shader+fragment shader+.. shader)组成的shader program。指定两个纹理的关键步骤见下面的代码。
protected override void DoRender(RenderEventArgs e)
{
ShaderProgram program = this.shaderProgram;
// 绑定shader
program.Bind(); program.SetUniformMatrix4(strprojectionMatrix, projectionMatrix.to_array());
program.SetUniformMatrix4(strviewMatrix, viewMatrix.to_array());
program.SetUniformMatrix4(strmodelMatrix, modelMatrix.to_array()); //设定第一个贴图
program.SetUniform(strtexture1, );//texture1.Name);
GL.ActiveTexture(GL.GL_TEXTURE0);
GL.Enable(GL.GL_TEXTURE_2D);
texture1.Bind(); //设定第二个贴图
program.SetUniform(strtexture2, );//texture2.Name);
GL.ActiveTexture(GL.GL_TEXTURE1);
GL.Enable(GL.GL_TEXTURE_2D);
texture2.Bind(); program.SetUniform(strpercent, percent); if (this.vertexArrayObject == null)
{
var vertexArrayObject = new VertexArrayObject(
this.positionBufferRenderer,
this.colorBufferRenderer,
//this.normalBufferRenderer,
this.indexBufferRenderer);
//创建的过程就是执行一次渲染的过程,所以不必再调用Render(e, program);
vertexArrayObject.Create(e, program); this.vertexArrayObject = vertexArrayObject;
}
else
{
this.vertexArrayObject.Render(e, program);
} // 解绑shader
program.Unbind(); texture2.Unbind();
texture1.Unbind();
}
Renderer.DoRender(RenderEventArgs e)
总结
要同时使用多个贴图的关键是调用GL.ActiveTexture(GL.GL_TEXTURE0);
|
//设定第一个贴图 program.SetUniform(strtexture1, 0);//texture1.Name); GL.ActiveTexture(GL.GL_TEXTURE0); GL.Enable(GL.GL_TEXTURE_2D); texture1.Bind(); |
CSharpGL(10)两个纹理叠加的更多相关文章
- QOpenGLTexture 两个纹理叠加
如何做纹理混合? 方法是,定义多个QOpenGLTexture,然后在fragment shader中添加相应的变量,然后把texture bind到对应的uniform变量上. 废话不多说 text ...
- CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探
CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码 ...
- 4.QOpenGLWidget-对三角形进行纹理贴图、纹理叠加
在上章3.QOpenGLWidget-通过着色器来渲染渐变三角形,我们为每个顶点添加颜色来增加图形的细节,从而创建出有趣的图像.但是,如果想让图形看起来更真实,我们就必须有足够多的顶点,从而指定足够多 ...
- 两个div叠加触发事件发生闪烁问题
今天遇到一个问题,想实现一个功能: 当鼠标移到div1上的时候,会出现div2.出现时div2在div1的上面,div2在出现后发生闪烁的问题. 于是开始找问题根源,发现原来是因为当我们触发div1的 ...
- 微信小程序-两个input叠加,多次点击字体变粗或闪动
问题描述: 当两个input叠加,多次点击input框, placeholder 字体变粗或input框闪动.如图: 代码: <!-- 最上层input-1 --> <input p ...
- WebGL编程指南案例解析之纹理叠加
var vShader = ` attribute vec4 a_Position; attribute vec2 a_TexCoord; varying vec2 v_TexCoord; void ...
- Unity Shader入门精要学习笔记 - 第10章 高级纹理
转载自 冯乐乐的 <Unity Shader入门精要> 立方体纹理 在图形学中,立方体纹理是环境映射的一种实现方法.环境映射可以模拟物体周围的环境,而使用了环境映射的物体可以看起来像镀了层 ...
- android动画特效之解决解决移动后闪烁现象,解决输入法弹出后位置回复原状,解决两个动画叠加
以下代码实现的效果是: BoundOpenView从居中移动到顶部,移动完后,BoundSendView从隐藏变为显示,并从顶部移动BoundOpenView下方20dp处,同时透明度慢慢增加. pr ...
- JavaScript 计算两个颜色叠加值
function multiply(rgb1, rgb2) { var result = [], i = 0; for( ; i < rgb1.length; i++ ) { result.pu ...
随机推荐
- 深入理解DIP、IoC、DI以及IoC容器
摘要 面向对象设计(OOD)有助于我们开发出高性能.易扩展以及易复用的程序.其中,OOD有一个重要的思想那就是依赖倒置原则(DIP),并由此引申出IoC.DI以及Ioc容器等概念.通过本文我们将一起学 ...
- SQLServer执行命令出现“目录无效的提示”
异常处理汇总-数据库系列 http://www.cnblogs.com/dunitian/p/4522990.html 一般都是清理垃圾清理过头了,把不该删的目录删了 网上说法: 问题描述: 1.s ...
- DataTable 转换成 Json的3种方法
在web开发中,我们可能会有这样的需求,为了便于前台的JS的处理,我们需要将查询出的数据源格式比如:List<T>.DataTable转换为Json格式.特别在使用Extjs框架的时候,A ...
- 深入学习jQuery自定义插件
原文地址:jQuery自定义插件学习 1.定义插件的方法 对象级别的插件扩展,即为jQuery类的实例增加方法, 调用:$(选择器).函数名(参数); $(‘#id’).myPlugin(o ...
- js数组学习整理
原文地址:js数组学习整理 常用的js数组操作方法及原理 1.声明数组的方式 var colors = new Array();//空的数组 var colors = new Array(3); // ...
- 微信小程序开发日记——高仿知乎日报(中)
本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该教 ...
- 【JQ基础】数组
each() 方法规定为每个匹配元素规定运行的函数.
- ES6之let命令详解
let与块级作用域 { var foo='foo'; let bar='bar'; } console.log(foo,'var'); //foo varconsole.log(bar ,'bar') ...
- Microsoft Visual Studio 2017 for Mac Preview 下载+安装+案例Demo
目录: 0. 前言 1. 在线安装器 2. 安装VS 3. HelloWorld 4. ASP.NET MVC 5. 软件下载 6. 结尾 0. 前言: 工作原因,上下班背着我的雷神,一个月瘦了10斤 ...
- Linux 权限设置chmod
Linux中设置权限,一般用chmod命令 1.介绍 权限设置chmod 功能:改变权限命令.常用参数: 1=x(执行权execute) 2=w(写权write) 4=r(读权Read) setuid ...