• 01 三角形的绘制


    1. #include "esUtil.h"
    2. typedef struct
    3. {
    4. // Handle to a program object
    5. GLuint programObject;
    6. } UserData;
    7. ///
    8. // 加载着色器源代码,返回一个着色器的对象 GLuint
    9. //
    10. GLuint LoadShader ( GLenum type, const char *shaderSrc )
    11. {
    12. GLuint shader;
    13. GLint compiled;
    14. // 创建一个着色器对象
    15. shader = glCreateShader ( type );
    16. if ( shader == 0 )
    17. {
    18. return 0;
    19. }
    20. // 加载着色器源代码,并输出一个着色器对象:shader
    21. glShaderSource ( shader, 1, &shaderSrc, NULL );
    22. // 编译着色器
    23. glCompileShader ( shader );
    24. // 检查编译的状态,将结果输出给:compiled
    25. glGetShaderiv ( shader, GL_COMPILE_STATUS, &compiled );
    26. if ( !compiled )
    27. {
    28. GLint infoLen = 0;
    29. glGetShaderiv ( shader, GL_INFO_LOG_LENGTH, &infoLen );
    30. if ( infoLen > 1 )
    31. {
    32. char *infoLog = malloc ( sizeof ( char ) * infoLen );
    33. glGetShaderInfoLog ( shader, infoLen, NULL, infoLog );
    34. esLogMessage ( "Error compiling shader:\n%s\n", infoLog );
    35. free ( infoLog );
    36. }
    37. glDeleteShader ( shader );
    38. return 0;
    39. }
    40. return shader;
    41. }
    42. ///
    43. // Initialize the shader and program object
    44. //
    45. int Init ( ESContext *esContext )
    46. {
    47. UserData *userData = esContext->userData;
    48. //顶点着色器
    49. // vec4 vPosition : 声明一个输入属性数组
    50. // layout(location = 0) 限定符表示这个变量的位置是顶点属性0
    51. char vShaderStr[] =
    52. "#version 300 es \n"
    53. "layout(location = 0) in vec4 vPosition; \n"
    54. "void main() \n"
    55. "{ \n"
    56. " gl_Position = vPosition; \n"
    57. "} \n";
    58. //片元着色器
    59. //
    60. char fShaderStr[] =
    61. "#version 300 es \n"
    62. "precision mediump float; \n"
    63. "out vec4 fragColor; \n"
    64. "void main() \n"
    65. "{ \n"
    66. " fragColor = vec4 ( 0.2, 0.3, 0.7, 1.0 ); \n"
    67. "} \n";
    68. GLuint vertexShader;
    69. GLuint fragmentShader;
    70. GLuint programObject;
    71. GLint linked;
    72. // 创建顶点着色器对象
    73. vertexShader = LoadShader ( GL_VERTEX_SHADER, vShaderStr );
    74. // 创建片段着色器对象
    75. fragmentShader = LoadShader ( GL_FRAGMENT_SHADER, fShaderStr );
    76. // 创建一个空的程序对象,链接顶点着色器,片段着色器,不同的着色器源码编译成着色器对象后,他们必须连接到一个程序对象并一起链接,才能绘制图形
    77. programObject = glCreateProgram ( );
    78. if ( programObject == 0 )
    79. {
    80. return 0;
    81. }
    82. // 将着色器shader添加到program
    83. glAttachShader ( programObject, vertexShader );
    84. glAttachShader ( programObject, fragmentShader );
    85. // 把片元着色器和顶点着色器连接到程序对象, 创建可执行的 OpenGL ES program
    86. glLinkProgram ( programObject );
    87. // Check the link status
    88. glGetProgramiv ( programObject, GL_LINK_STATUS, &linked );
    89. if ( !linked )
    90. {
    91. GLint infoLen = 0;
    92. glGetProgramiv ( programObject, GL_INFO_LOG_LENGTH, &infoLen );
    93. if ( infoLen > 1 )
    94. {
    95. char *infoLog = malloc ( sizeof ( char ) * infoLen );
    96. glGetProgramInfoLog ( programObject, infoLen, NULL, infoLog );
    97. esLogMessage ( "Error linking program:\n%s\n", infoLog );
    98. free ( infoLog );
    99. }
    100. glDeleteProgram ( programObject );
    101. return FALSE;
    102. }
    103. // Store the program object
    104. userData->programObject = programObject;
    105. glClearColor ( 1.0f, 1.0f, 1.0f, 0.0f );
    106. return TRUE;
    107. }
    108. ///
    109. // Draw a triangle using the shader pair created in Init()
    110. //
    111. void Draw ( ESContext *esContext )
    112. {
    113. UserData *userData = esContext->userData;
    114. GLfloat vVertices[] = { -0.5f, 0.5f, 0.0f,
    115. -0.5f, -0.5f, 0.0f,
    116. 0.5f, 0.5f, 0.0f
    117. };
    118. // Set the viewport
    119. glViewport ( 0, 0, esContext->width, esContext->height );
    120. // 每次绘制之前需要清除颜色缓冲区
    121. glClear ( GL_COLOR_BUFFER_BIT );
    122. // 绑定程序对象,进行渲染
    123. glUseProgram ( userData->programObject );
    124. //第一个参数指定我们要配置的顶点属性。和顶点着色器对应: layout(location = 0) in vec4 vPosition值(Location)吗?它可以把顶点属性的位置值设置为0。因为我们希望把数据传递到这一个顶点属性中,所以这里我们传入0。
    125. //第二个参数指定顶点属性的大小。顶点属性是一个vec3,它由3个值组成,所以大小是3。
    126. //第三个参数指定数据的类型,这里是GL_FLOAT(GLSL中vec*都是由浮点数值组成的)。
    127. glVertexAttribPointer ( 0, 3, GL_FLOAT, GL_FALSE, 0, vVertices );
    128. glEnableVertexAttribArray ( 0 );
    129. // 绘制图元
    130. glDrawArrays ( GL_TRIANGLES, 0, 3 );
    131. }
    132. void Shutdown ( ESContext *esContext )
    133. {
    134. UserData *userData = esContext->userData;
    135. glDeleteProgram ( userData->programObject );
    136. }
    137. int esMain ( ESContext *esContext )
    138. {
    139. esContext->userData = malloc ( sizeof ( UserData ) );
    140. esCreateWindow ( esContext, "Hello Triangle", 220, 240, ES_WINDOW_RGB );
    141. if ( !Init ( esContext ) )
    142. {
    143. return GL_FALSE;
    144. }
    145. esRegisterShutdownFunc ( esContext, Shutdown );
    146. esRegisterDrawFunc ( esContext, Draw );
    147. return GL_TRUE;
    148. }

  • 相关阅读:
    CRM客户关系管理系统源码跟单销售公司订单跟进客户公海合同管理办公erp客户管理(小程序+APP+H5)
    【问题解决】Linux-conda环境下安装PyKDL无法链接.so动态库
    AutoSAR入门到精通讲解-总目录
    DSP开发环境及工具之CCS
    Nginx+Tomcat负载均衡、动静分离
    Elasticsearch查询过程
    Kotlin文件遍历FileTreeWalk filter
    rsync远程同步
    python+pytest接口自动化(15)-日志管理模块loguru简介
    关于Flask_运行导入Flask的py文件的两种方式
  • 原文地址:https://blog.csdn.net/s12117719679/article/details/126131488