2016-03-11 29 views
0

我有质感,我可以在OpenGL-ES渲染与正交矩阵:移动的像素在OpenGL-ES(安卓)围绕

gst_gl_shader_set_uniform_matrix_4fv(shader, "u_transformation", 1, FALSE, identity_matrix); 

我想“周围的像素”移动:一半顶部朝左,底部的一半朝右下方,如下图所示。有没有一种“简单”的方法来做到这一点?我在Android上。

在这个相关的回答问题How to crop/clip in OpenGL using u_transformation,我能够保持顶部'a'或底部'e'。在“剪切”两个场景之后有没有办法做到“double gst_gl_shader_set_uniform_matrix_4fv”?

enter image description here

回答

0

Reto中描述的公式回答'半'工作,因为它们只在左边产生“a”或在右边产生“e”,但不是同时产生。

我找到解决的办法是增加一倍顶点和索引的数量和玩的顶点坐标如下:

static const GLfloat vertices[] = { 
1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 
0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 
0.0f, -1.0f, 0.0f, 0.0f, 0.5f, 
1.0f, -1.0f, 0.0f, 1.0f, 0.5f, 

0.0f, 1.0f, 0.0f, 1.0f, 0.5f, 
-1.0f, 1.0f, 0.0f, 0.0f, 0.5f, 
-1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 
0.0f, -1.0f, 0.0f, 1.0f, 1.0f 
}; 

static const GLushort indices[] = { 0, 1, 2, 0, 2, 3, 4, 5, 6, 4, 6, 7 }; 
1

,你想在这里的改造不能通过变换矩阵来表示。矩阵只能表示某些类别的转换。在3D空间中:

  • 3x3矩阵表示线性变换。典型的例子包括旋转,缩放,镜像,剪切。
  • 4x3矩阵表示仿射变换。除此之外,这包括翻译。
  • 如果将三维空间扩展为具有四个分量的同质坐标,则4x4矩阵可以表示其他类别的转换,如投影。

您草图中的转换不属于上述情况。所以将矩阵应用到顶点将无法做到这一点。

那么你能做什么?两个选项浮现在脑海中:

  1. 如果你可以很容易得出两个部分(上/下,左/右)分开,可以很明显的做,简单的改变使这两个部分之间的转换。
  2. 将逻辑应用于着色器代码中。

对于选项2,您可以在顶点或片段着色器中执行此操作。如果没有跨越两个部分之间边界的基元,则在顶点着色器中处理它会更高效。否则,可以在片段着色器中使用类似的逻辑。

写生关键部分的顶点着色器的情况下,假设你现在有,让你在左侧草图的安排如下:

// Calculate output position and store it in variable "pos". 
gl_Position = pos; 

要获得第二布置,逻辑可能像这样(没有经过充分测试...):

if (pos.y > 0.0) { 
    gl_Position = vec4(0.5 * pos.x - 0.5, 2.0 * pos.y - 1.0, pos.zw) 
} else { 
    gl_Position = vec4(0.5 * pos.x + 0.5, 2.0 * pos.y + 1.0, pos.zw); 
} 

的想法是,你检查顶点是否在顶部或底部的一半,规模/相应做出调整,它的坐标空间的上半部分地图进入左半部分和下半部分坐标空间进入右半部分。

这可能是由与sign操作更换条件精简一些:

float s = sign(pos.y); 
gl_Position = vec4(0.5 * pos.x - sign * 0.5, 2.0 * pos.y - sign, pos.zw); 

一些更多的照顾,将需要如果pos.w不是1.0,如果发生如将透视投影应用于顶点。在这种情况下,您必须在上面的计算中包含w的除法。