iphone - iPhone 中 GLSL ES 2.0 上来自多个点源的 2D 照明

标签 iphone c++ opengl-es opengl-es-2.0 cocos2d-x

因为我是着色器的完全菜鸟,所以我在尝试使用 2D 照明系统时遇到了一些问题,该系统基本上用 2D 黑色纹理覆盖屏幕,在亮区所在的位置有透明孔。

因为我只使用一个纹理,所以我想我必须在片段着色器中执行此操作,对吗?

片段着色器:

#ifdef GL_ES
precision mediump float;
#endif

// Texture, coordinates and size
uniform sampler2D u_texture;
varying vec2 v_texCoord;
uniform vec2 textureSize;

uniform int lightCount;

struct LightSource
{
    vec2 position;
    float radius;
    float strength;
};

uniform LightSource lights[10];

void main()
{
    float alpha = 1.0;

    vec2 pos = vec2(v_texCoord.x * textureSize.x, v_texCoord.y * textureSize.y);

    int i;
    for (i = 0; i < lightCount; i++)
    {
        LightSource source = lights[i];

        float distance = distance(source.position, pos);

        if (distance < source.radius)
        {
            alpha -= mix(source.strength, 0.0, distance/source.radius);
        }
    }

    gl_FragColor = vec4(0.0, 0.0, 0.0, alpha);
}

问题是性能真的很糟糕(不能以 60fps 的速度运行,有 2 个灯并且屏幕上没有其他任何东西),有什么建议可以让它变得更好,甚至可以用不同的方法来解决这个问题?

顺便说一下,我是在 cocos2d-x 上做的,所以如果有人有任何使用 cocos2d 元素的想法,也将受到欢迎:)

最佳答案


我完全同意蒂姆。如果你想提高总速度,你必须避免 for 循环。我建议您,如果灯光数组大小始终为 10,则将循环语句与循环内容的 10 个拷贝交换。您应该知道,您在循环语句中声明的任何变量都将在循环结束时被释放!所以将循环分成十个部分是个好主意(丑陋,但这是一个老派的把戏;))))
此外,我还建议您在每个语句中都添加一些 println,以查看哪些指令在乱用。我敢打赌混合操作是罪魁祸首。我对 cocos2d 一无所知,但是,可以在过程结束时进行独特的混合调用,并总结距离和优势吗?似乎在某些时候有一个相当耗费 float 的恼人操作

关于iphone - iPhone 中 GLSL ES 2.0 上来自多个点源的 2D 照明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12285565/

相关文章:

iphone - "plist"无法从 iPhone 单元测试类加载

c++ - 找不到为什么会出现错误

c++ - 我可以在 iPhone 上运行简单的 C++ 命令行脚本吗?

iphone - 如何在某种数据库中拥有 mp3 文件并在 ios 中访问?

iphone - 如何在UITableview中选择多行

iphone - 搜索栏的背景图片在 iOS7 中看起来很奇怪,但在 iOS 6 中看起来很好

c++ - 不能在另一个类中声明类

opengl-es - 如何使用 GLSL 在纹理周围绘制边框

android - GLSurfaceView onResume - 选项卡式应用程序创建上下文

iphone - 如何使用 OpenGL ES 将像素数据传输到屏幕?