ZBLOG

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

下面是一个简单的使用OpenGL和着色器的例子,适用于Ubuntu环境。我们将使用GLEW来管理OpenGL扩展,并用GLFW创建窗口。这个示例将绘制一个彩色三角形。

前提条件

  1. 确保安装了必要的库

在终端中运行以下命令来安装所需的库:

   sudo apt update
   sudo apt install build-essential libgl1-mesa-dev libglu1-mesa-dev libglew-dev libglfw3-dev
  1. 创建项目目录
    
    mkdir OpenGLShaderExample
    cd OpenGLShaderExample
    

创建着色器代码

创建一个名为shader.vs的顶点着色器文件:

#version 330 core

layout(location = 0) in vec3 position;
layout(location = 1) in vec3 color;

out vec3 vertexColor;

void main()
{
    gl_Position = vec4(position, 1.0);
    vertexColor = color;
}

创建一个名为shader.fs的片段着色器文件:

#version 330 core

in vec3 vertexColor;
out vec4 fragColor;

void main()
{
    fragColor = vec4(vertexColor, 1.0);
}

创建主程序代码

在同一目录下,创建一个名为 main.cpp 的文件,并添加以下内容:

#include <iostream>
#include <GL/glew.h>
#include <GLFW/glfw3.h>

// 着色器编译工具函数
GLuint loadShader(const char* shaderSource, GLenum shaderType) {
    GLuint shader = glCreateShader(shaderType);
    glShaderSource(shader, 1, &shaderSource, nullptr);
    glCompileShader(shader);

    // 检查编译状态
    GLint success;
    glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
    if (!success) {
        char infoLog[512];
        glGetShaderInfoLog(shader, 512, nullptr, infoLog);
        std::cerr << "Error: Shader compilation failed\n" << infoLog << std::endl;
    }
    
    return shader;
}

int main() {
    // 初始化 GLFW
    if (!glfwInit()) {
        std::cerr << "Failed to initialize GLFW" << std::endl;
        return -1;
    }

    // 设置版本和配置选项
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    // 创建窗口
    GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL Shader Example", nullptr, nullptr);
    if (!window) {
        std::cerr << "Failed to create GLFW window" << std::endl;
        glfwTerminate();
        return -1;
    }
    
    glfwMakeContextCurrent(window);

    // 初始化 GLEW
    glewExperimental = true; 
    if (glewInit() != GLEW_OK) {
        std::cerr << "Failed to initialize GLEW" << std::endl;
        return -1;
     }

     // 定义三角形的数据 (位置和颜色)
     GLfloat vertices[] = {
         // Positions          // Colors       
         -0.5f, -0.5f, 0.0f,   1.0f, 0.0f, 0.0f,
          0.5f, -0.5f, 0.0f,   0.0f, 1.0f, 0.0f,
          0.0f,  0.5f, 0.0f ,   0.0f , 0.f ,1.f 
     };

     GLuint VBO , VAO ;
     glGenVertexArrays(1 , &VAO );
     glGenBuffers(1 , &VBO );

     glBindVertexArray(VAO );

      // 将数据复制到 GPU 中 
      glBindBuffer(GL_ARRAY_BUFFER,VBO );
      glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices , GL_STATIC_DRAW );

      // 设置位置属性 
      glVertexAttribPointer( /* location */             ,
                          /* size */                ,
                          /* type */                ,
                          /* normalized? */         ,
                          /* stride */              ,
                          /* pointer */               );

      // 启用位置属性 
      glEnableVertexAttribArray( );
      
      GLuint vertexShader = loadShader("#include \"shader.vs\"", GL_VERTEX_SHADER);
      GLuint fragmentShader = loadShader("#include \"shader.fs\"", GL_FRAGMENT_SHADER);

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


// 链接着色器 
	glLinkProgram(shaderProgram );

// 删除已附加的着色器,因为链接后它们不再需要 
	glDeleteShader(vertexShader );  
	glDeleteShader(fragmentShade r);  

	// 主循环 
	while (!glfwWindowShouldClose(window)) {     
       // 清除屏幕   
       glClear(GL_COLOR_BUFFER_BIT);     

       // 使用我们的着色器程序  
       glUseProgram(shaderProgram );    

       // 绘制三角形  
      	glBindVertexArray(VAO );    
      
      	
	 	glDrawArrays(GL_TRIANGLES , 

           | | 
		
                   )
       
           
		//交换缓冲区并轮询事件   
		glfwSwapBuffers(window);     
		glfwPollEvents();    
	}    

	
	   
	
	  


	// 清理资源   
	gli :X><>> //
	  ^^vD>~~~ <<
	i Rg ~>
	           |
	   
		
		        |

};

编译与运行

在项目目录中,使用以下命令编译代码:

g++ main.cpp -o OpenGLExample -lGLEW -lGL -lglfw && ./OpenGLExample

如果一切顺利,你应该会看到一个包含彩色三角形的新窗口。

注意事项

  • 确保你的显卡驱动程序是最新的,以便支持OpenGL。
  • 此示例使用了基本错误处理,如果遇到任何问题,可以根据错误信息进行排查。

如有其他问题,请随时问我!


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?