ZBLOG

在 Ubuntu 上使用 OpenGL ES 实现一个简单的着色器示例

在 Ubuntu 上使用 OpenGL ES 实现一个简单的着色器示例涉及多个步骤,包括设置开发环境、创建一个基本的 OpenGL ES 程序并编写顶点和片段着色器。下面是一个简单的教程,展示如何实现这一过程。

1. 安装必要的库

首先,确保你已经安装了必要的库和工具。在终端中运行以下命令:

sudo apt update
sudo apt install build-essential libglfw3-dev libgles2-mesa-dev
  • libglfw3-dev 是用于创建窗口和处理输入的库。
  • libgles2-mesa-dev 是 OpenGL ES 2 的开发库。

2. 创建项目结构

在你的工作目录中创建一个新的文件夹:

mkdir OpenGLESExample
cd OpenGLESExample

然后,在这个文件夹内创建两个源文件,一个用于主程序,另一个用于着色器代码:

touch main.cpp vertex_shader.glsl fragment_shader.glsl

3. 编写着色器代码

打开 vertex_shader.glsl 文件,并添加以下代码:

#version 100 // 对于 OpenGL ES 2.0

attribute vec4 aPos; // 顶点位置

void main() {
    gl_Position = aPos; // 将顶点位置传递到裁剪空间
}

接下来,打开 fragment_shader.glsl 文件,并添加以下代码:

#version 100 // 对于 OpenGL ES 2.0

precision mediump float; // 指定浮点数精度

void main() {
    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); // 将颜色设置为红色
}

4. 编写主程序

打开 main.cpp 文件并添加以下代码:

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

using namespace std;

// 着色器加载函数
const char* LoadShaderSource(const char* filePath) {
    stringstream buffer;
    ifstream file(filePath);
    
    if (!file.is_open()) {
        cerr << "Error opening shader file: " << filePath << endl;
        return nullptr;
    }

    buffer << file.rdbuf();
    return buffer.str().c_str();
}

// 创建着色器函数 
GLuint CreateShader(GLenum type, const char* source) {
    GLuint shader = glCreateShader(type);
    glShaderSource(shader, 1, &source, NULL);
    glCompileShader(shader);

    GLint success;
    glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
    
    if (!success) {
        char infoLog[512];
        glGetShaderInfoLog(shader, sizeof(infoLog), NULL, infoLog);
        cerr << "Error compiling shader: " << infoLog << endl;
    }

    return shader;
}

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

    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2); // 设置OpenGL版本为ES2
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);

    GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL ES Example", NULL, NULL);
    
    if (window == nullptr) {
        cerr << "Failed to create window" << endl;
        glfwTerminate();
        return -1;
    }
    
	// 设置上下文 
	glfwMakeContextCurrent(window);

	// 加载 GLEW(可选,用于调试)
	glewExperimental = GL_TRUE;

	if (glewInit() != GLEW_OK) {
	    cout << "Failed to initialize GLEW" << endl;
	    return -1;   
	}

	const char* vertexSource = LoadShaderSource("vertex_shader.glsl");
	const char* fragmentSource = LoadShaderSource("fragment_shader.glsl");

	GLuint vertexShader = CreateShader(GL_VERTEX_SHADER, vertexSource);
	GLuint fragmentShader = CreateShader(GL_FRAGMENT_SHADER, fragmentSource);

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

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

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

	glBindVertexArray(VAO);

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

	glVertexAttribPointer(0 ,2 , GL_FLOAT , GL_FALSE , sizeof(float)*2,(void*)nullptr );
	
	glEnableVertexAttribArray(0); 

	while (!glfwWindowShouldClose(window)) {
	    // 渲染循环 
	    glClear(GL_COLOR_BUFFER_BIT);  

	    glUseProgram(shaderProgram);
	    
	    glBindVertexArray(VAO);  
	    glDrawArrays(GL_TRIANGLES ,0 ,3 ); 

	    glfwSwapBuffers(window);  
	    glfwPollEvents();  
	}

	// 清理资源 
	glDeleteVertexArrays(1,&VAO );
	glDeleteBuffers(1,&VBO );
	
	glDeleteProgram(shaderProgram );  
	glDeleteShader(vertexShader );  
	glDeleteShader(fragmentShader );  

	// 销毁窗口和终止 GLFW 
	glfwDestroyWindow(window);  
	glfwTerminate();  
    
	return 0;  
}

5. 编译和运行程序

现在,你可以通过以下命令编译和运行这个示例:

g++ main.cpp -o OpenGLESExample -lGLEW -lglfw -lm && ./OpenGLESExample

如果一切正常,你应该会看到一个窗口,其中显示了一个红色三角形。

总结

这是在 Ubuntu 上使用 OpenGL ES 实现简单着色器示例的基本步骤。你可以根据需要扩展它,例如加入更多复杂的几何体或效果。希望这能帮助你入门!


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

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?