gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:00:15 27 4
gpt4 key购买 nike

因为我是着色器的完全菜鸟,所以我在尝试使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com