我试图找到一个解决办法,让我用一个不同的属性绕Z轴的点精灵(即统一不会做)。具有不同旋转的OpenGL ES 2.0点精灵 - 在着色器中计算矩阵?
在我的应用我有每帧数百/被吸引数千点的精灵,然后将其保存在维也纳组织(很能切实最终被> 1,000,000)。因此,我正在寻找内存使用和性能之间的最佳折衷方案。
顶点&片段着色目前看是这样的:
// VERTEX SHADER
attribute vec4 a_position;
attribute vec4 a_color;
attribute float a_size;
uniform mat4 u_mvpMatrix;
varying vec4 v_color;
void main()
{
v_color = a_color;
gl_Position = u_mvpMatrix * a_position;
gl_PointSize = a_size;
}
// FRAGMENT SHADER
precision mediump float;
uniform sampler2D s_texture;
varying vec4 v_color;
void main()
{
vec4 textureColor = texture2D(s_texture, gl_PointCoord);
gl_FragColor = v_color * textureColor;
}
我目前可以设想以下可能性:
添加
mat4 rotMatrix
属性我点精灵的数据。它传递给片段着色器和旋转每个片段:vec2 texCoord = (rotMatrix * vec4(gl_PointCoord, 0, 1)).xy gl_FragColor = v_color * texture2D(s_texture, texCoord);
- 优点:
- 保持着色器简单。
- 简单代码来计算着色器外基质(使用
GLKit
例如)。
- 缺点:
- 大规模增加了我的点精灵数据的大小(从16到80字节/点4x4矩阵;到52个字节/点的3x3矩阵......我相信这是可能的使用3x3旋转矩阵?)。这可能会导致我的应用程序更快崩溃3-5次!
- 推很多更多的计算到CPU(数百/每秒数千帧矩阵计算的)。
- 优点:
添加
float angle
属性我点精灵的数据,然后计算在顶点着色器的旋转矩阵。如上所述将旋转矩阵传递给片段着色器。- 优点:
- 保持指向子画面数据大小较小(从16到20字节/点)。
- 推动繁重矩阵数学运用到GPU。
- 保持指向子画面数据大小较小(从16到20字节/点)。
- 缺点:
- 需要编写自定义GLSL函数来创建旋转矩阵。不是一个大问题,但我的数学矩阵是生疏了,所以这可能是容易出错,尤其是当我试图找出3x3矩阵解决方案...
- 鉴于这一定会发生数百/千顶点,这是否会严重影响性能(尽管由GPU处理)?
- 优点:
- 我可以实际与用于角属性(255个不同的角度将是足够的)1个字节对应。有没有什么方法可以使用某种查找方式,以便我不需要不必要地重新计算相同的旋转矩阵?我首先想到了在顶点着色器中存储常量,但我不想开始在我的着色器中放置分支语句。
任何想法,以一个好办法?
嗨,我没有实际尝试过,这听起来像是一个合理的解决方案。自发布问题我已经解决了我的问题,但忘记发布答案(感谢提醒我!)。我最终计算了顶点着色器中的旋转矩阵。即使在第一代iPad上,性能影响可以忽略不计,而且它使我的数据结构保持较小。你的方法也可以工作,但一个缺点是它会增加我的纹理内存使用量(我需要每个精灵200多次旋转)。我喜欢顶点着色解决方案,因为我不需要摆弄精灵,性能是可以接受的。 – Stuart