Love2d着色器 - 获取像素着色器中所有网格顶点的位置

时间:2017-07-14 16:03:15

标签: glsl shader love2d

拜托,我有一个着色器,可以通过适当的插值在网格四边形上正确绘制纹理。 问题是,我目前必须发送在像素着色器中单独使用的所有4个网格点的数据作为" extern"数据以获得正确的像素位置。

我需要让所有4个位置都可用于像素着色器以获得正确的位置,但是id喜欢从我在love.graphics.draw()中发送的数据中获取它们所以我不必双重发送。既可以提高性能又可以使代码更清晰。 (网格不包含z坐标,因此从第4个坐标导出适当的插值)。

在love.graphics.draw(mesh,...)期间发送的转换在TransformMatrix中可以使用并且已经应用​​了,但我仍然无法访问love.graphics.draw()期间发送的网格顶点所以我事先提供它作为" extern"。

是否可以访问像素着色器中的所有网格顶点而无需在附加函数中提供数组?

*像素着色器中的数学是从screen_coords派生的,并且没有直接应用网格位置或变换

网格数据:

v = {
    { 0,0, 0,0, 255,0,255,255 };
    { 150,0, 1,0, 0,255,255,255 };
    { 100,200, 1,1, 255,255,0,255 };
    { 0,200, 0,1, 255,255,255,255 };
};
mesh = love.graphics.newMesh( v, "fan" )
mesh:setTexture( image )

绘制网格:

love.draw()
    shader.on() --shader on
    shader.sendVertices( v[1],v[2],v[3],v[4] )
    love.graphics.draw( mesh, 250, 250, 0, 2, 3) --mesh to draw
    shader.off() --shader off
end

为像素着色器提供顶点的函数:

function sendVertices(v1,v2,v3,v4)
     gl_send(glsl,"vv",v2,v3,v4,v1,v1)
end

着色器:

glsl=love.graphics.newShader[[
    extern vec2[4] vv;

    vec2 v1 = vv[0];
    vec2 v2 = vv[1];
    vec2 v3 = vv[2];
    vec2 v4 = vv[3];

    //vertex shader unmodified

    //pixel shader
    some really long math derived from screen_coords, using all 4 positions 
    v1 to v4, which are exactly same positions as vertices sent to vertex 
    shader before matrix transformation.
]]

0 个答案:

没有答案