love2d一个好玩的地方是支持glsl1.2,并修改简化,glsl1.2的文档

地址为:http://www.opengl.org/registry/doc/GLSLangSpec.Full.1.20.8.pdf

glsl是opengl的着色器语言,还有其它类似的语言,如微软的HLSL,

NviDIA的Cg等,关于着色器的介绍可以参见此文。我会按照该系列文章

的思路写几篇love2d下的glsl用法。简单的说glsl可以让显卡按我们自定义

的渲染流程来处理像素点和图片的颜色变化、混合、光照等。

记住三个关键词就可以使用glsl了,即创建、加载、更新(此步非必须)。

1、创建 love.graphics.newShader( code )

code是一段着色器代码,love2d会把这段代码交给显卡处理,这个函数

会返回创建成功后的shader对象。

2、加载 love.graphics.setShader( shader )

使用指定的shader绘图,如果不加参数则是关闭着色器。

3、更新 Shader:send()

在love.update()里可以通过shader对象的send函数更新数据,支持以下数据:

extern number time; 时间
  extern vec2 light_pos; 光照
  extern vec4 colors[4]; 颜色

下面这个是摘自官方wiki的代码:(略作修改)

main.lua

function love.load()
--lua里字符串有换行要用[[]]括起
local shadercode=[[
//这里是类C的语法,注释使用"//",每个语句结尾用";",函数用"()" extern number time; //time变量用来和外部交换,外部程序可以给这个time传值
vec4 effect(vec4 color, Image texture, vec2 texture_coords, vec2 pixel_coords)
{ //(r,g,b,a)颜色,取值0-1,这里对time变量进行操作保证结果在0-1范围内
return vec4((1.0+sin(time))/2.0, abs(cos(time)), abs(sin(time)), 1.0);
}
]]
--1 创建shader
myeffect = love.graphics.newShader(shadercode)
end function love.draw()
-- 2 关闭shader,矩形为默认效果
love.graphics.setShader()
love.graphics.rectangle('fill', ,,,) -- 2 加载effect shader,矩形效果绚丽
love.graphics.setShader(myeffect)
love.graphics.rectangle('fill', ,,,)
end local t =
function love.update(dt)
t = t + dt
myeffect:send("time", t) --3 更新
end

运行后下面矩形的颜色会随着时间变化,每个点的颜色都是

vec4((1.0+sin(time))/2.0, abs(cos(time)), abs(sin(time)), 1.0)

上面的代码可以修改如下:

main.lua 不使用shader

local t =
function love.draw()
love.graphics.setColor(,,,)
love.graphics.rectangle('fill', ,,,)
love.graphics.setColor((1.0+math.sin(t))/2.0*, math.abs(math.cos(t))*, math.abs(math.sin(t))*, )
love.graphics.rectangle('fill', ,,,)
end function love.update(dt)
t = t + dt
end

两者的效果一样,那我们为什么需要shader呢?

使用shader时,点的颜色变花计算是在显卡里完成的;不用shader时,点的颜色变化计算是在CPU里

完成的,之后还要把结果传给显卡,这样做没有利用显卡,效率不高,而且有些特效如果不用shader

实现会很麻烦。

love2d--glsl01简单的渲染的更多相关文章

  1. geotrellis使用(九)使用geotrellis进行栅格渲染

    目录 前言 图像渲染 总结 参考链接 一.前言        前面几篇文章讲解了如何使用Geotrellis进行数据处理.瓦片生成等,今天主要表一下如何使用Geotrellis进行栅格渲染.     ...

  2. ArcGIS Engine要素渲染和专题图制作(转)

    摘要:Feature的常用的绘制方法包括:1.简单绘制:2.唯一值绘制/多字段唯一值绘制:3.点密度/多字段点密度绘制:4.数据分级绘制:5.质量图(饼图/直方图): 6.按比例尺渲染:7.比例符号渲 ...

  3. 渲染voronoi图

    渲染voronoi图要比计算voronoi图简单. 渲染voronoi图: 方法1: 在pixel shader里,对每一个像素,求哪个种子点到它的距离最近,将此种子点的颜色作为此像素颜色. 当种子点 ...

  4. 第1部分: 游戏引擎介绍, 渲染和构造3D世界

    原文作者:Jake Simpson译者: 向海Email:GameWorldChina@myway.com ---------------------------------------------- ...

  5. 使用D3D渲染YUV视频数据

    源代码下载 在PC机上,对于YUV格式的视频如YV12,YUY2等的显示方法,一般是采用DIRECTDRAW,使用显卡的OVERLAY表面显示.OVERLAY技术主要是为了解决在PC上播放VCD而在显 ...

  6. UE4里的渲染线程

    记的上次看过UniRx里的源代码,说是参考微软的响应式编程框架,响应式编程里的一些理论不细说,只单说UniRx里的事件流里的事件压入与执行,与UE4的渲染线程设计有很多相同之处,如果有了解响应式编程相 ...

  7. vue初学实践之路——vue简单日历组件(1)

    ---恢复内容开始--- 最近做的项目有一个需求,需要有一个日历组件供预定功能使用,之前的代码过于繁琐复杂,所以我采用vue重写了这个组件. npm.vue等等安装. 只是一个简单的日历组件,所以并不 ...

  8. 【Unity Shader】新书封面 — Low Polygon风格的渲染

    写在前面 最近又开心又担心,因为我的书马上就要上市了,开心当然是因为等了这么久终于可以如愿了,担心是因为不少人对它的期待都很大,我第一次写书,能力也有限,不知道能不能让大家满意,让大家也都喜欢上它.不 ...

  9. 服务端预渲染之Nuxt (使用篇)

    服务端预渲染之Nuxt - 使用 现在大多数开发都是基于Vue或者React开发的,能够达到快速开发的效果,也有一些不足的地方,Nuxt能够在服务端做出渲染,然后让搜索引擎在爬取数据的时候能够读到当前 ...

随机推荐

  1. 9个实用的Javascript代码高亮脚本

    代码高亮很有用,特别是在需要在网站或者blog中显示自己编写的代码的时候,或者给其他人查看或调试语法错误的时候.我们可以将代码高亮,以便阅读者可以十分方便的读取代码块,增加用户阅读代码的良好体验. 目 ...

  2. qt study 泛型和容器

    所谓泛型(generic) 能够像操作基本类型一样轻松操作对象的类和函数. qt容器类就是泛型类,基于模板的泛型类. 重载运算符overloaed operator, 托管容器 managed con ...

  3. [Python爬虫] 之五:Selenium 处理滚动条

     selenium并不是万能的,有时候页面上操作无法实现的,这时候就需要借助JS来完成了. 当页面上的元素超过一屏后,想操作屏幕下方的元素,是不能直接定位到,会报元素不可见的.这时候需要借助滚动条来拖 ...

  4. RS报内存错误XQE-ROL-0183

    描述问题:RS开发了一个报表,里面涉及日期维度精细判断,还有FM里面做的权限处理,处理逻辑可能比较复杂,后面又加了一个case when的数据项结果就出现了下面的错误 下面就说一下处理方案 从字面意思 ...

  5. C#基础视频教程5.2 如何编写简单的超级热键

    我们前面已经理解了如何使用官方的代码实现鼠标键盘的监控,其实还差一点,因为他的代码只能捕捉单个的按键,而其实我们要的是组合键.什么是组合键呢?比如我想定义同时按下WIN+C是去执行屏幕截图.这只要理解 ...

  6. vsftpd 本地用户无法登陆 530 Login incorrect

    查看日志,监测用户无法登陆的错误日志 tail -f /var/log/secure 查看vsFTPd配置 /etc/vsftpd/vsftpd.conf 通过查看日志,发现用户的密码已经过期了... ...

  7. PHP 杂项函数

    PHP 杂项 函数 PHP 杂项函数简介 我们把不属于其他类别的函数归纳到杂项函数类别. 安装 杂项函数是 PHP 核心的组成部分.无需安装即可使用这些函数. Runtime 配置 杂项函数的行为受 ...

  8. 算法笔记_034:大整数乘法(Java)

    目录 1 问题描述 2 解决方案 2.1 蛮力法   1 问题描述 计算两个大整数相乘的结果. 2 解决方案 2.1 蛮力法 package com.liuzhen.chapter5; import ...

  9. 【Linux】tail命令

    用途 tail命令主要用于取出后边几行 全称 tail命令的全称即为tail(尾巴) 参数 -n :后边接数字,代表显示几行的意思 -f :循环读取 -q :不显示处理信息 -v :显示详细的处理信息 ...

  10. conn

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...