static char* vShaderStr = "attribute vec4 a_position; \n" "attribute vec4 a_color; \n" "varying vec4 v_color; \n" "void main() \n" "{ \n" " v_color = a_color; \n" " gl_Position = a_position; \n" "} \n"; static char* fShaderStr = "#ifdef GL_ES \n" "precision highp float; \n" "#endif \n" " \n" "varying vec4 v_color; \n" " \n" "void main (void) \n" "{ \n" " gl_FragColor = v_color; \n" "}";
●每个着色器有一个main()方法,就像一个典型的C程序。针对每个顶点(顶点着色器中)或每个片段/像素(片段着色器中)执行代码。
●无论什么程序转换/效果,每个顶点的最终位置靠分配坐标至gl_Position进行设置;另一方面,每个像素的最终颜色通过指定颜色至gl_FragColor进行设置。
●属性是变量,我们可以将其绑定到我们的外部C + +代码。因为顶点着色器是管线中的第一个组件,我们传递属性至位置和颜色,并让其通过内部变量(改变v_color)传递颜色属性至片段着色器。
●位置和颜色属性(a_position和a_color)是一个有4个坐标(X,Y,Z,W,用于确定位置)和 (r,g,b,a,用于确定颜色) 的矢量格式。
●在我们的例子中,我们对最终的顶点位置和像素颜色不作修改,所以我们需要做的是直接分配属性至gl_Position(或使用传递的改变v_color 传递至gl_FragColor)
●如果您直接将着色器的源代码插入您的C + +代码,不要忘了换行符“\ n”
现在,我们需要两个局部变量,让他们连接到我们的着色器:一个用于确定位置,一个用于确定颜色。
attPosition = glGetAttribLocation(__programObject, "a_position");
attColor = glGetAttribLocation(__programObject, "a_color");
My3D::OnDraw(void)
{
result r = E_SUCCESS;
glViewport(0, 0, this->GetWidth(), this->GetHeight());
glClearColor ( 0.0f, 0.0f, 0.0f, 1.0f );
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
GLfloat vVertices[] = { 0.5f, -0.5f, 0.0f,
-0.5f, -0.5f, 0.0f,
0.0f, 0.5f, 0.0f};
GLfloat vColors[] = { 1.0f, 0.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f};
glVertexAttribPointer(attPosition, 3, GL_FLOAT, GL_FALSE, 0, vVertices); glVertexAttribPointer(attColor, 4, GL_FLOAT, GL_FALSE, 0, vColors); glEnableVertexAttribArray(attPosition);
glEnableVertexAttribArray(attColor);
glDrawArrays(GL_TRIANGLES, 0, 3);
Commit();
return r;
}
●首先,我们设置了视口并将背景调为漆黑色●其次,我们定义了三个顶点作为我们的三角形的三个角及三种颜色,其将用于每个顶点。
●然后,我们基本上是将我们的位置和颜色(attPosition和attColor)成员变量“指”向这些阵列。我们指定向量是否由三个方面(如为顶点的情况下)或四个方面(在我们的颜色的情况下,包括alphas)组成。你可以使用额外的参数,但他们是在我们的范围之外。
●此外,我们启用我们的着色器属性成员变量 - 因此在OpenGL ES图形管线中存储两个阵列。
●最后,我们使用这一点上存储在图形管线中的阵列来要求OpenGL ES绘制三角形。并将渲染传递至屏幕。
完成!
片段着色器修改
为了好玩,让我们稍微修改像素着色器,所以,修改在该行的片段着色器的源:
gl_FragColor = v_color;
to this
gl_FragColor = v_color * vec4(0.5, 0.5, 0.5, 1.0);
您可能已经猜到,这一修改将使整体渲染形象颜色加深约50%!让我们来看看是否您可以找到不同之处: