OpenGL ES 着色器脚本

时间:2022-09-12 20:04:41
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%!让我们来看看是否您可以找到不同之处: