OpenGL ES 2.0 Android应用程序 - 概念性问题

时间:2014-03-04 23:28:09

标签: android opengl-es

我正在学习用于Android的OpenGL ES 2.0,其中包括来自BROTHALER,Kevin的“OpenGL ES 2 for Android”一书。在其他一些文献中,我能够学习OpenGL,但在我的路上,我有一些疑问。

第一个问题

当我学习OpenGL 1.0时,有一个功能“ GLU.glLookAT ”来设置摄像机的视图。 OpenGL 2.0上有类似的功能吗? 我知道“w”组件,ortographic和透视投影,但我发现“GLU.glLookAt”对我的学习很有帮助,我想知道2.0上是否有类似的东西。

第二个问题

在处理不同的颜色时,我得到了以下代码(总结):

vertexShaderCode = "attribute vec4 a_Position;   " +
                   "attribute vec4 a_Color;      " +
                   "varying vec4 v_Color;        " +

                   "void main(){                 " +
                   "    v_Color = a_Color;       " +
                   "    gl_Position = a_Position;" +
                   "}"


fragmentShaderCode = "precision mediump float;   " +
                     "varying vec4 v_Color;      " +

                     "void main(){               " +
                     "    gl_FragColor = v_Color;" +
                     "}"


... (some code) ...

int a_Position = GLES20.glGetAttribLocation(myShaderProgram, "a_Position");
int a_Color = GLES20.glGetAttribLocation(myShaderProgram, "a_Color");

GLES20.glEnableVertexAttribArray(a_Position);
GLES20.glEnableVertexAttribArray(a_Color);

GLES20.glVertexAttribPointer(a_Position, etc)
GLES20.glVertexAttribPointer(a_Color, etc)

GLES20.glDrawArrays(GL_TRIANGLES, 0, 3);

我想说的是,我告诉属性“a_Position”和“a_color”他们在哪里以及如何获取他们的信息,但是“v_Color”呢?

我从这段代码中了解到片段着色器正在从顶点着色器接收信息,因为在那里创建了变化的“v_Color”,但我认为着色器之间没有交叉对话。在后台,真正发生了什么?

而且,“a_Color”就是“中间”属性。没有像:

这样的功能
GLES20.glVertexVaryinLocation(...)

1 个答案:

答案 0 :(得分:0)

  1. 在ES2中,您必须定义自己的矩阵并将它们发送到着色器。有许多方法,例如LookAt,您通常可以将它们作为某些矩阵工具的一部分。所以一般来说你正在寻找的是操纵你的矩阵的工具,通常包含翻译,旋转,正交,平截头,看...等等。
  2. 你的v_Color很像gl_Position这两个将被插值并发送到片段着色器,这不是“交叉对话”,因为首先顶点着色器将完成其工作,然后片段着色器将开始从顶点着色器接收数据(过度简化,尝试this)。 varying用于将插值数据发送到片段着色器。这意味着,例如,如果您要绘制由2个顶点定义的线,其中第一个具有黑色,第二个具有白色,则其间的所有像素都是灰色的,从而创建从黑色到白色的平滑线性渐变。对于更有用的情况(然后是颜色)你会对纹理坐标和法线做同样的事情,用(.0,.0)到(1.0,1.0)的纹理坐标绘制四边形会在片段着色器中发送插值坐标您可以直接访问纹理,绘制正确的纹理元素。例如,在四边形的中间,坐标将是(.5,.5)。所以glVertexVaryinLocation没有意义,因为这些数据取决于很多东西,比如你的缓冲区分辨率,4像素线会产生4个独特的颜色值,而5像素线会产生另外5个。