`
yidongkaifa
  • 浏览: 4219204 次
文章分类
社区版块
存档分类
最新评论

OpenGL ES 着色器脚本

 
阅读更多
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%!让我们来看看是否您可以找到不同之处:

分享到:
评论

相关推荐

    opengl es rgb转yuv 顶点和片元着色器脚本

    在“opengl es rgb转yuv 顶点和片元着色器脚本”中,顶点着色器可能负责将原始的RGB图像数据映射到屏幕坐标系,确保每个像素对应正确的位置。它通常不涉及颜色空间转换,因为它的主要任务是处理几何信息。 片元着色...

    opengl es yuv转rgb 顶点和片元着色器脚本

    总结起来,OpenGL ES中的YUV到RGB转换主要通过顶点和片元着色器实现,其中顶点着色器处理几何信息,片元着色器则负责颜色转换。理解这两种着色器的工作原理以及YUV和RGB颜色空间之间的转换是实现这一过程的关键。...

    Windows&Linux;_opengles2.tar.gz

    在解压"opengles2"文件后,你会看到源代码文件,可能包括.c或.cpp文件,以及可能的.sh或.bat脚本用于编译和运行。源代码中应该包含初始化OpenGL ES上下文、创建和绑定着色器、定义顶点数据、设置渲染状态、以及绘制...

    渐变色着色器脚本.txt

    ### 渐变色着色器脚本知识点解析 #### 一、标题理解:“渐变色着色器脚本” 此标题表明脚本的主要功能是实现一种渐变色效果的渲染技术,通过图形学中的着色器(shader)来完成。在计算机图形学中,着色器是一种...

    Mali_OpenGL_ES_SDK_Linux_x64.tar.gz

    通过OpenGL ES 2.0,开发者可以利用着色器语言(如GLSL ES)编写高效的图形处理算法,实现更丰富的视觉体验。 在Linux环境下,开发者需要熟悉C或C++编程,以及OpenGL ES的编程模型,包括顶点、片段着色器的使用,纹理...

    The OpenGL ES Shading Language

    GLSL ES允许开发者编写运行在图形处理单元(GPU)上的着色器程序,以实现高级图形效果。这个文档重述了GLSL的关键部分,因此在内容上是自包含的,用户无需参考其他资料即可理解。 GLSL ES 1.00版本的文档是在2009年...

    Qt6 QML Book/图形效果/顶点着色器示例源码

    ShaderEffectSource用于指定要应用着色器的源图像,而ShaderEffect则提供了编写GLSL(OpenGL Shading Language)着色器脚本的接口。 四、源码分析 "UntitledProject1"的源码中,我们可以看到如何在QML中定义和使用...

    使用 C++ 和 OpenGL ES 2 为 Android、iOS 和 Web 开发一个简单的空气曲棍球游戏_C语言_代码

    OpenGL ES 2相较于1.x版本,引入了着色器模型,允许开发者编写更复杂的顶点和片段着色器,从而实现更精细的图形效果。在空气曲棍球游戏中,OpenGL ES 2用于绘制游戏场景,包括球台、空气曲棍球、球杆等元素,并处理...

    OpenGL ES教程以及COCOS 2D教程大全(文档)

    4. **着色器(Shaders)**:用GLSL(OpenGL Shading Language)编写的程序,用于处理顶点和像素的颜色和位置。 5. **缓冲区(Buffers)**:存储数据的内存区域,如顶点数据和颜色数据。 6. **状态机(State Machine...

    三星6410 opengl es 开发包 sdk

    在开发过程中,开发者可能会遇到的问题包括兼容性问题、性能优化、内存管理、纹理映射、顶点着色器和片段着色器的编写等。通过SDK提供的工具和文档,开发者可以解决这些问题,并实现高质量的图形效果。 总的来说,...

    opengles4android,开放式3.0.zip

    《OpenGLES4Android:开启安卓3D图形编程之旅》 OpenGLES4Android,正如其名,是一个针对安卓操作系统的开源项目,旨在利用OpenGL ES 4.0标准来实现高性能的3D图形编程。OpenGL ES是OpenGL的一个子集,专为嵌入式...

    GLSL 基础介绍(OpenGLES 2.0)

    在OpenGLES 2.0中,引入了GLSL,使得开发者能够通过编写顶点着色器和片段着色器来实现复杂的图形效果,从而大大提升了图形编程的灵活性和扩展性。GLSL被设计得类似于C/C++语言,因此对C语言有一定的基础是必要的。 ...

    安卓源码Barrage_OpenGLES.zip

    3. **Shader程序**:GLSL(OpenGL Shading Language)编写的顶点和片段着色器,用于在屏幕上绘制弹幕。 4. **纹理加载**:加载弹幕文字或图像为OpenGL纹理,可能使用Bitmap或者AssetManager。 5. **数据结构**:存储...

    android3D颜色隧道(openGL-ES)

    OpenGL-ES提供了基本的绘图功能,如顶点坐标、纹理映射、光照效果以及着色器语言(GLSL),开发者可以利用这些工具来创建复杂的3D模型和动画。 描述中提到,这个项目支持Android API 1.6及更高版本,这意味着它具有...

    基于openGL实现的安卓滤镜相机app

    这种滤镜的实现依赖于OpenGL ES的顶点着色器和片段着色器,它们允许开发者自定义像素的色彩处理,实现丰富的颜色变换效果。 下部分镜则支持模式调节的滤镜,这可能包括亮度、对比度、饱和度等调整,或者是各种预设...

    OpenGLCamera2.zip

    7. **源码分析**:在解压后的OpenGLCamera2文件中,开发者可以找到相关的Java代码(用于Android应用逻辑)、C/C++代码(可能用于本地库以提高性能)以及GLSL着色器脚本。通过阅读和理解这些代码,可以学习到如何将...

    WebGL是一种3D绘图标准,这种绘图技术标准允许把JavaScript和OpenGL ES

    同时,了解并熟练使用GLSL(OpenGL Shading Language)也是必要的,因为它是编写WebGL着色器的语言。 总的来说,WebGL为Web开发者提供了强大的工具,使他们能够在浏览器中实现令人惊叹的3D效果。随着硬件性能的提升...

    openGL时间水印录制

    为了支持多种滤镜,可以利用OpenGL的着色器语言GLSL(OpenGL Shading Language)编写自定义的顶点和片段着色器。着色器可以改变像素的颜色、透明度、光照效果等,从而实现各种视觉效果。滤镜的实现可能包括模糊、...

    android+opengl+jni,android环境下使用opengl绘制纹理贴图和三角形等

    在Android平台上,OpenGL ES(OpenGL ...这涉及创建OpenGL上下文、加载纹理、定义顶点和着色器,以及通过JNI调用来执行原生代码。通过这种方式,开发者可以充分利用硬件加速特性,为用户提供流畅且视觉丰富的图形体验。

    OpenGL.zip_Android opengl_Android实例代码_android_opengl_opengl andr

    此外,还会涉及纹理加载、帧缓冲对象(Frame Buffer Objects, FBOs)和着色器语言(OpenGL Shading Language, GLSL)的使用,这些都是在Android平台上利用OpenGL ES进行图形编程的关键技术。总之,这个实例代码是一...

Global site tag (gtag.js) - Google Analytics