下面是一个使用FreeGLUT和OpenGL在Ubuntu上实现简单着色器的例子。这个例子将创建一个窗口并绘制一个使用顶点着色器和片段着色器的简单三角形。
环境准备
首先,确保你已经安装了OpenGL、FreeGLUT和GLEW。在终端中运行以下命令来安装它们:
sudo apt update
sudo apt install freeglut3-dev libglew-dev mesa-utils
创建程序文件
- 创建一个新的C++源文件,例如
shader_example.cpp
。 - 将以下代码复制到该文件中:
#include <iostream>
#include <GL/glew.h>
#include <GL/freeglut.h>
// 着色器源码
const char* vertexShaderSource = R"(
#version 330 core
layout(location = 0) in vec3 position;
void main() {
gl_Position = vec4(position, 1.0);
}
)";
const char* fragmentShaderSource = R"(
#version 330 core
out vec4 color;
void main() {
color = vec4(1.0, 0.5, 0.2, 1.0); // 设置颜色为橙色
}
)";
// 编译着色器的函数
GLuint compileShader(GLenum type, const char* source) {
GLuint shader = glCreateShader(type);
glShaderSource(shader, 1, &source, nullptr);
glCompileShader(shader);
// 检查编译错误
GLint success;
glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
if (!success) {
GLchar infoLog[512];
glGetShaderInfoLog(shader, sizeof(infoLog), nullptr, infoLog);
std::cerr << "ERROR::SHADER::COMPILATION_FAILED\n" << infoLog << std::endl;
}
return shader;
}
// 初始化 OpenGL 和设置渲染环境
void init() {
GLuint vertexShader = compileShader(GL_VERTEX_SHADER, vertexShaderSource);
GLuint fragmentShader = compileShader(GL_FRAGMENT_SHADER, fragmentShaderSource);
GLuint shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
// 定义三角形的顶点数据
GLfloat vertices[] = {
0.0f, 0.5f, 0.0f,
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
};
GLuint VBO; // 顶点缓冲对象
GLuint VAO; // 顶点数组对象
// 创建VBO和VAO,并绑定数据
glGenVertexArrays(1,&VAO);
glGenBuffers(1,&VBO);
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER,VBO);
// 将顶点数据复制到缓冲区中供OpenGL使用
glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GLL_STATIC_DRAW);
// 设置顶点属性指针
glVertexAttribPointer(0 ,3 ,GL_FLOAT , GL_FALSE ,3 * sizeof(GLfloat), (GLvoid*)nullptr);
glEnableVertexAttribArray(0);
//解绑 VAO 和 VBO
glBindBuffer(GL_ARRAY_BUFFER , 0 );
glBindVertexArray( 0 );
}
void display() {
static GLuint shaderProgram;
// 清除屏幕并设置背景颜色
glClearColor(1.f, 1.f ,1.f ,1.f );
glClear(GL_COLOR_BUFFER_BIT);
// 使用我们的着色器程序绘制三角形:
glUseProgram(shaderProgram);
glBindVertexArray(VAO);
glDrawArrays(GL_TRIANGLES , 0 ,3 );
glutSwapBuffers();
}
// 主函数入口
int main(int argc,char** argv ) {
glutInit(&argc ,argv );
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(800 ,600 );
glutCreateWindow("Simple Shader Example");
glewExperimental=true;
if (glewInit() != GLEW_OK ) {
std::cerr << "Error initializing GLEW" << std::endl;
return -1;
}
init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
编译和运行
在终端中导航到保存该文件的目录,并使用以下命令编译它:
g++ shader_example.cpp -o shader_example -lGLEW -lglut -lGL
然后运行程序:
./shader_example
注意事项
- 确保你的显卡驱动支持OpenGL。
- 如果遇到任何问题,请检查GLEW是否正确初始化,以及是否有任何其他错误信息输出。
这是一个基本示例,展示了如何在Ubuntu上使用FreeGLUT和OpenGL编写和使用着色器。根据需要,你可以扩展这个示例,以增加更多功能或复杂性。
内容由零声教学AI助手提供,问题来源于学员提问