zoukankan      html  css  js  c++  java
  • love2d--glsl01简单的渲染

        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', 10,10,790,285) -- 2 加载effect shader,矩形效果绚丽 love.graphics.setShader(myeffect) love.graphics.rectangle('fill', 10,305,790,285) end local t = 0 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 = 0
    function love.draw()
        love.graphics.setColor(255,255,255,255)
        love.graphics.rectangle('fill', 10,10,790,285)
        love.graphics.setColor((1.0+math.sin(t))/2.0*255, math.abs(math.cos(t))*255, math.abs(math.sin(t))*255, 255)
        love.graphics.rectangle('fill', 10,305,790,285)
    end
    
    
    function love.update(dt)
        t = t + dt
    end

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

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

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

    实现会很麻烦。

     

     

     

     

  • 相关阅读:
    综合练习:词频统计
    Dart SDK 2.0安装问题
    The DartEditor executable launcher was unable to locate its companion shared library.
    pycharm中如何正确配置pyqt5
    发现黑苹果带双显示器无法启动的原因
    Pycharm中用鼠标改变字体大小
    失望的visual studio for mac
    laravel 函数测试 --- Route::has()
    laragon 之Nginx
    laragon 之xdebug
  • 原文地址:https://www.cnblogs.com/xdao/p/love2d_shader01.html
Copyright © 2011-2022 走看看