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 ...
随机推荐
- Logstash实践: 分布式系统的日志监控
文/赵杰 2015.11.04 1. 前言 服务端日志你有多重视? 我们没有日志 有日志,但基本不去控制需要输出的内容 经常微调日志,只输出我们想看和有用的 经常监控日志,一方面帮助日志微调,一方面及 ...
- Java 8 的 Nashorn 脚本引擎教程
本文为了解所有关于 Nashorn JavaScript 引擎易于理解的代码例子. Nashorn JavaScript 引擎是Java SE 8的一部分,它与其它像Google V8 (它是Goog ...
- 谈谈一些有趣的CSS题目(九)-- 巧妙的实现 CSS 斜线
开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...
- C#异步编程
什么是异步编程 什么是异步编程呢?举个简单的例子: using System.Net.Http; using System.Threading.Tasks; using static System.C ...
- 玩转ajax
1.什么是ajax? Ajax 是 Asynchronous JavaScript and XML(以及 DHTML 等)的缩写. 2.ajax需要什么基础? HTML 用于建立 Web 表单并确定应 ...
- 常用 meta 整理
<!-- 针对手持设备优化,主要是针对一些老的不识别viewport的浏览器,比如黑莓 --> <meta name="HandheldFriendly" con ...
- HttpPost过程中使用的URLEncoder.encode(something, encode)
URLEncoder.encode("刘美美", "utf-8").toString() = %E5%88%98%E7%BE%8E%E7%B ...
- KOTLIN开发语言文档(官方文档) -- 2.基本概念
网页链接:https://kotlinlang.org/docs/reference/basic-types.html 2. 基本概念 2.1. 基本类型 从可以在任何变量处理调用成员函数和属性 ...
- CSS垂直居中总结
工作中遇到垂直居中问题,特此总结了一下几种方式与大家分享.本文讨论的垂直居中仅支持IE8+ 1.使用绝对定位垂直居中 <div class="container"> & ...
- Fedora 21 安装 Nvidia 驱动以及失败后的补救方法
在 Linux 桌面系统下玩了这么久,大部分时间都是使用 Ubuntu,偶尔使用一下 Fedora.我的电脑中安装有多个 Linux 发行版,见这里<在同一个硬盘上安装多个Linux发行版及Fe ...