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 ...
随机推荐
- CSS的未来
仅供参考 前言 完成<CSS核心技术与实战>这本书,已有一个多月了,而这篇文章原本是打算写在那本书里面的,但本章讲解的内容,毕竟属于CSS未来的范畴,而这一切都还不能够确定下来,所以这一章 ...
- Fis3的前端工程化之路[三大特性篇之内容嵌入]
Fis3版本:v3.4.22 Fis3的三大特性 资源定位:获取任何开发中所使用资源的线上路径 内容嵌入:把一个文件的内容(文本)或者base64编码(图片)嵌入到另一个文件中 依赖声明:在一个文本文 ...
- Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境
首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...
- Dapper扩展之~~~Dapper.Contrib
平台之大势何人能挡? 带着你的Net飞奔吧!http://www.cnblogs.com/dunitian/p/4822808.html#skill 上一篇文章:Dapper逆天入门~强类型,动态类型 ...
- 深入node之Transform
Transform流特性 在开发中直接接触Transform流的情况不是很多,往往是使用相对成熟的模块或者封装的API来完成流的处理,最为特殊的莫过于through2模块和gulp流操作.那么,Tra ...
- 浅谈java异常[Exception]
学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:589809992 我们一起学Java! 一. 异常的定义 在<java编程思想 ...
- Java开发中的23种设计模式详解
[放弃了原文访问者模式的Demo,自己写了一个新使用场景的Demo,加上了自己的理解] [源码地址:https://github.com/leon66666/DesignPattern] 一.设计模式 ...
- 【从零开始学BPM,Day4】业务集成
[课程主题] 主题:5天,一起从零开始学习BPM [课程形式] 1.为期5天的短任务学习 2.每天观看一个视频,视频学习时间自由安排. [第四天课程] 1.课程概要 Step 1 软件下载:H3 BP ...
- [css]实现垂直居中水平居中的几种方式
转自博客 http://blog.csdn.net/freshlover/article/details/11579669 居中方式: 一.容器内(Within Container) 内容块的父容器设 ...
- CodingLife主题更新
收到反馈说CodingLife主题某些地方显示有问题,于是进行了更新,并且已提交.官方那边正在进行测试,我自己这边测完应该是没问题的,但不知道官方啥时候会进行更新,所以把CSS代码贴出来,有需要的可以 ...