我正在学习用于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(...)
答案 0 :(得分:0)
v_Color
很像gl_Position
这两个将被插值并发送到片段着色器,这不是“交叉对话”,因为首先顶点着色器将完成其工作,然后片段着色器将开始从顶点着色器接收数据(过度简化,尝试this)。 varying
用于将插值数据发送到片段着色器。这意味着,例如,如果您要绘制由2个顶点定义的线,其中第一个具有黑色,第二个具有白色,则其间的所有像素都是灰色的,从而创建从黑色到白色的平滑线性渐变。对于更有用的情况(然后是颜色)你会对纹理坐标和法线做同样的事情,用(.0,.0)到(1.0,1.0)的纹理坐标绘制四边形会在片段着色器中发送插值坐标您可以直接访问纹理,绘制正确的纹理元素。例如,在四边形的中间,坐标将是(.5,.5)。所以glVertexVaryinLocation
没有意义,因为这些数据取决于很多东西,比如你的缓冲区分辨率,4像素线会产生4个独特的颜色值,而5像素线会产生另外5个。