ZBLOG

Ubuntu 使用gles 实现一个着色器的例子

在Ubuntu上使用OpenGL ES实现一个简单的着色器示例,您需要安装一些必要的库和工具,并编写相应的代码。以下是一个基本的步骤:

环境准备

  1. 安装依赖: 首先,确保您的Ubuntu系统已安装以下依赖项。可以通过终端运行以下命令:
   sudo apt-get update
   sudo apt-get install build-essential libglfw3-dev libglm-dev libgles2-mesa-dev
  1. 创建项目目录: 创建一个新的目录来存放你的代码文件。
   mkdir gles_example
   cd gles_example

编写代码

  1. 创建顶点着色器 (vertex_shader.glsl):
   #version 300 es
   in vec4 position;
   
   void main() {
       gl_Position = position; // 设置顶点位置
   }
  1. 创建片段着色器 (fragment_shader.glsl):
   #version 300 es
   precision mediump float;
   
   out vec4 fragColor;

   void main() {
       fragColor = vec4(1.0, 0.5, 0.0, 1.0); // 橙色输出
   }
  1. 编写主程序 (main.cpp):
#include <GLES2/gl2.h>
#include <EGL/egl.h>
#include <GLFW/glfw3.h>
#include <iostream>
#include <fstream>
#include <sstream>

const char* vertexShaderSource = R"(
    attribute vec4 position;
    void main() {
        gl_Position = position;
    }
)";

const char* fragmentShaderSource = R"(
    precision mediump float;
    void main() {
        gl_FragColor = vec4(1.0, 0.5, 0.0, 1.0);
    }
)";

void checkShaderCompile(GLuint shader) {
    GLint success;
    glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
    
    if (!success) {
        char infoLog[512];
        glGetShaderInfoLog(shader, 512, NULL, infoLog);
        std::cout << "ERROR::SHADER_COMPILATION_ERROR\n" << infoLog << std::endl;
    }
}

GLuint createShader(GLenum type, const char* source) {
    GLuint shader = glCreateShader(type);
    glShaderSource(shader, 1, &source, NULL);
    glCompileShader(shader);
    
    checkShaderCompile(shader);

    return shader;
}

int main() {
    glfwInit();
    
    // 使用 OpenGL ES 的上下文版本设置。
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
    
    GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL ES Example", nullptr, nullptr);
    
    if (!window) {
        std::cerr << "Failed to create GLFW window" << std::endl;
        return -1;
    }

    glfwMakeContextCurrent(window);

     // 初始化着色器。
     GLuint vertexShader = createShader(GL_VERTEX_SHADER, vertexShaderSource);
     GLuint fragmentShader = createShader(GL_FRAGMENT_SHADER, fragmentShaderSource);

     GLuint shaderProgram = glCreateProgram();
     glAttachShader(shaderProgram, vertexShader);
     glAttachShader(shaderProgram, fragmentShader);
     glLinkProgram(shaderProgram);

     // 定义三角形的顶点数据。
     GLfloat vertices[] = {
         -0.5f, -0.5f,
          0.5f , -0.5f,
          0.f ,  0.5f 
      };

      GLuint VBO; 
      GLuint VAO;

      // 创建VAO和VBO,并绑定数据。
      glGenVertexArrays(1,&VAO); 
      glGenBuffers(1,&VBO); 

      glBindVertexArray(VAO); 

      glBindBuffer(GL_ARRAY_BUFFER,VBO); 
      glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices.GL_STATIC_DRAW); 

      GLint posAttrib=glGetAttribLocation(shaderProgram,"position");
      
      // 启用顶点属性并指向数据.
      glEnableVertexAttribArray(posAttrib); 
      
      // 指定顶点属性的数据格式.
      glVertexAttribPointer(posAttrib,
                            2,
                            GL_FLOAT,
                            GL_FALSE,
                            sizeof(GLfloat)*2,
                            (void*)nullptr);

      while (!glfwWindowShouldClose(window)) {

          // 清空屏幕.
          glClear(GL_COLOR_BUFFER_BIT);

          // 绘制三角形.
          glUseProgram(shaderProgram); 
          
          // 绘制调用(使用VAO)。
          glDrawArrays(GL_TRIANGLES ,0 ,3);  

          glfwSwapBuffers(window);
          glfwPollEvents();
       }

       // 删除创建的资源.
       glDeleteVertexArrays(1,&VAO );  
       gldeleteBuffers(1,&VBO );  
       gldeleteprogram(shaderprogram );

       glfwTerminate();  
       
       return 0;  
}

编译与运行

  1. 编译代码: 在项目目录中,使用以下命令编译代码。确保链接到正确的库。
g++ main.cpp -o gles_example -lGLESv2 -lEGL -lglfw -lm
  1. 运行程序: 一旦编译成功,您可以运行生成的可执行文件。
./gles_example

总结

这个简单示例演示了如何在Ubuntu上使用OpenGL ES绘制一个橙色三角形。您可以根据需要修改顶点和片段着色器以及绘制逻辑以实现更复杂的效果。在实际应用中,还需要考虑更多细节,如错误处理、资源管理等。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:http://sdn.0voice.com/?id=6598

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?