下面是一个简单的使用OpenGL和着色器的例子,适用于Ubuntu环境。我们将使用GLEW来管理OpenGL扩展,并用GLFW创建窗口。这个示例将绘制一个彩色三角形。
前提条件
- 确保安装了必要的库:
在终端中运行以下命令来安装所需的库:
sudo apt update
sudo apt install build-essential libgl1-mesa-dev libglu1-mesa-dev libglew-dev libglfw3-dev
- 创建项目目录:
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助手提供,问题来源于学员提问