【问题标题】:OpenGL ES 2.0 Android Application - Conceptual QuestionsOpenGL ES 2.0 Android 应用程序 - 概念问题
【发布时间】:2014-03-05 16:13:13
【问题描述】:

我正在学习 OpenGL ES 2.0 for Android 的“OpenGL ES 2 for Android”一书,作者 Kevin 兄弟。通过其他一些文献,我能够学习 OpenGL,但在我的路上我有一些疑问。

第一个问题

在我学习 OpenGL 1.0 的时候,有一个函数“GLU.glLookAT”来设置相机的视图。 OpenGL 2.0 上有类似的功能吗? 我知道“w”组件、正交投影和透视投影,但我发现 "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(...)

【问题讨论】:

    标签: android opengl-es


    【解决方案1】:
    1. 在 ES2 中,您必须定义自己的矩阵并将它们发送到着色器。有许多方法,例如 LookAt,您通常可以在某些矩阵工具中找到它们。因此,总的来说,您正在寻找的是用于操作矩阵的工具,这些矩阵通常包含平移、旋转、正交、平截头体、lookAt...
    2. 您的v_Color 很像gl_Position 这两个将被插值并发送到片段着色器,这不是“串扰”,因为首先顶点着色器将完成其工作,然后片段着色器将开始从顶点着色器接收数据(过于简单,试试this)。 varying 用于将插值数据发送到片段着色器。这意味着,例如,如果您要绘制由 2 个顶点定义的线,其中第一个顶点为黑色,第二个顶点为白色,则其间的所有像素都是灰色的,从而创建从黑色到白色的平滑线性渐变。对于更有用的情况(然后是颜色),您将对纹理坐标和法线执行相同的操作,使用从 (.0, .0) 到 (1.0, 1.0) 的纹理坐标绘制四边形将在片段着色器中向您发送插值坐标,所以您可以直接访问纹理,绘制正确的纹素。例如,在四边形的中间,坐标为 (.5, .5)。所以glVertexVaryinLocation 毫无意义,因为这些数据取决于很多因素,例如您的缓冲区分辨率,一条 4 像素的线会产生 4 个唯一的颜色值,而 5 像素的线会产生另外 5 个。

    【讨论】:

      猜你喜欢
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-04
      • 1970-01-01
      相关资源
      最近更新 更多